Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2016-02-11 02:48:20 +0000
committerGerrit Code Review @ Eclipse.org2016-02-12 15:31:41 +0000
commitecd4928b327f5561364c5068c9ff5f1668e92d13 (patch)
tree7c34f46cf82a1d65ac753fa92c2a5d55371b8dba /plugins/infra/misc
parent751a204d74e15eb2db6b41c937691fc56dcc1252 (diff)
downloadorg.eclipse.papyrus-ecd4928b327f5561364c5068c9ff5f1668e92d13.tar.gz
org.eclipse.papyrus-ecd4928b327f5561364c5068c9ff5f1668e92d13.tar.xz
org.eclipse.papyrus-ecd4928b327f5561364c5068c9ff5f1668e92d13.zip
Bug 485220: [Architecture] Provide a more modular architecture
https://bugs.eclipse.org/bugs/show_bug.cgi?id=485220 Factor UI dependencies out of the UML Element Types bundle. This includes moving some advices that interact with the user into a new org.eclipse.papyrus.uml.service.types.ui bundle. Pull up the PasteCommandService and IPasteCommandProvider API into the Infra Diagram layer where the extension point is defined. Deprecate the old API in the UML layer. Introduce a service for participation of languages in CSS styling: * styling reset actions in the Reset Style command * access to semantic model classes and properties to make available to CSS Factor PapyrusObservableValue and cohorts out of the UML Tools bundle into the Infra Layer for more general reuse and to relieve the Diagram Infrastructure layer of UML dependencies. The old API remains as deprecated. Remove the Infra Diagram Layer dependency on UML Layer for property testers governing deletion in the diagram. Includes introduction of a new IGraphicalDeletionHelper OSGi service for delegation of the determination of whether an element can be deleted from the diagram and replacement of the XML expression properties * org.eclipse.papyrus.uml.diagram.common.isSemanticDeletion * org.eclipse.papyrus.uml.diagram.common.isReadOnly by * org.eclipse.papyrus.infra.gmfdiag.common.isSemanticDeletion * org.eclipse.papyrus.infra.gmfdiag.common.canDelete (where the latter is the negation of the property that it supersedes) Extract UML dependencies from the Diagram Outline and CSS Editor bundles. Remove unused MDTUtil APIs that referenced a UML-specific annotation. Move the Diagram Infrastructure CSS Palette bundle into the UML layer because it serves to provide extensions on the Palette Service, which is an overtly UML-specific capability. All client APIs for the Properties View are moved from org.eclipse.papyrus.views.properties bundle to a new org.eclipse.papyrus.infra.properties.ui bundle. This includes renaming of: * extension points * label-provider contexts * XWT namespaces Add an "all UI tests" suite. Define a componentized hierarchical build layout of the main plug-ins Change-Id: I43f8f3644857a18b69715f5a2f1da9b1cf286d67
Diffstat (limited to 'plugins/infra/misc')
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.classpath7
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.project28
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.settings/org.eclipse.jdt.core.prefs291
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.settings/org.eclipse.jdt.ui.prefs68
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/META-INF/MANIFEST.MF36
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/about.html28
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/build.properties10
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowDown_16x16.gifbin0 -> 332 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowLeft_16x16.gifbin0 -> 327 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowRight_16x16.gifbin0 -> 541 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowUp_16x16.gifbin0 -> 323 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/file.gifbin0 -> 577 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/hyperlink.gifbin0 -> 596 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/insp_sbook.gifbin0 -> 459 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/plugin.properties5
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/plugin.xml59
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/pom.xml12
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/hyperlinkContributor.exsd125
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/org.eclipse.papyrus.infra.hyperlink.registration.exsd124
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/org.eclipse.papyrus.infra.hyperlink.tab.registration.exsd121
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/specificHyperLinks.exsd102
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/Activator.java88
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/AbstractDeleteHyperLinkCommand.java83
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkDocumentCommand.java72
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkObjectCommand.java56
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkPageCommand.java78
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkWebCommand.java72
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/DeleteHyperLinkDocumentCommand.java73
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/DeleteHyperLinkPageCommand.java75
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/EmptyAllHyperLinkCommand.java68
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/AbstractHyperLinkHelper.java121
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/CompositeHyperlinkHelper.java118
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/DocumentHyperLinkHelper.java98
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/HyperLinkHelperFactory.java143
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/IHyperlinkHelperExtension.java40
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/ObjectHyperLinkHelper.java161
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/WebHyperLinkHelper.java100
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/messages/Messages.java137
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/messages/messages.properties67
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkDocument.java108
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkObject.java114
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkSpecificObject.java84
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkWeb.java67
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/preferences/HyperlinkServicePreferencesPage.java218
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/HyperlinkContributor.java29
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/HyperlinkService.java24
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/impl/HyperlinkServiceImpl.java193
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractEditHyperlinkDocumentShell.java235
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractEditHyperlinkShell.java189
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractHyperLinkManagerShell.java140
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractHyperLinkTab.java141
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractLookForEditorShell.java376
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/DefaultHyperLinkTab.java349
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorHyperLinkWebShell.java172
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorHyperlinkDocumentShell.java164
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorNavigationDialog.java155
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/HyperLinkManagerShell.java415
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/HyperLinkTab.java413
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/EditorListContentProvider.java97
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkConstants.java67
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkException.java55
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkFilteredLabelProvider.java25
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkHelpersRegistrationUtil.java113
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkLabelProvider.java238
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkTabsRegistrationUtil.java107
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/TreeViewContentProvider.java64
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/.classpath7
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/.project28
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/.settings/org.eclipse.jdt.core.prefs291
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/.settings/org.eclipse.jdt.ui.prefs68
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/META-INF/MANIFEST.MF16
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/about.html28
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/build.properties7
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/plugin.xml42
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/pom.xml12
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/Activator.java69
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/handler/ImportPSFHandler.java163
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/runtime/ImportResult.java46
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/runtime/ProjectSetImporter.java471
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/ui/FilterProjectsDialog.java270
-rwxr-xr-xplugins/infra/misc/org.eclipse.papyrus.infra.sync/.classpath7
-rwxr-xr-xplugins/infra/misc/org.eclipse.papyrus.infra.sync/.project28
-rwxr-xr-xplugins/infra/misc/org.eclipse.papyrus.infra.sync/.settings/org.eclipse.jdt.core.prefs291
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/.settings/org.eclipse.jdt.ui.prefs68
-rwxr-xr-xplugins/infra/misc/org.eclipse.papyrus.infra.sync/META-INF/MANIFEST.MF22
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/about.html28
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/build.properties19
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/DeveloperDoc.html291
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/default.css59
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.di2
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.notation4042
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.uml1139
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Exclude_Views_from_Synchronization.pngbin0 -> 35368 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Notation_Sync_Classes.pngbin0 -> 26118 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Notation_Synchronization.pngbin0 -> 22278 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Plug-ins.pngbin0 -> 26780 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Framework_Core_Classes.pngbin0 -> 27505 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Policy_Classes.pngbin0 -> 27137 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Service_Classes.pngbin0 -> 25558 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization.pngbin0 -> 19252 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Exclusions.pngbin0 -> 28097 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Overrides.pngbin0 -> 25348 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Overrides_1.pngbin0 -> 38299 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronize_Model_Elements.pngbin0 -> 24752 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronize_Model_Elements_1.pngbin0 -> 27386 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Test_Classes.pngbin0 -> 10267 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Test_Plug-ins.pngbin0 -> 7136 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Use_Cases.pngbin0 -> 58171 bytes
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/plugin.properties13
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/plugin.xml31
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/pom.xml12
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/schema/triggers.exsd101
-rwxr-xr-xplugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/Activator.java73
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFDispatch.java89
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFDispatchManager.java272
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFListener.java264
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectEAttributeSyncFeature.java256
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectEReferenceSyncFeature.java122
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectMasterSlaveSyncBucket.java32
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectSyncBucket.java27
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectSyncItem.java40
-rwxr-xr-xplugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EStructuralFeatureSyncDispatcher.java62
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EStructuralFeatureSyncFeature.java535
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/ISyncObject.java86
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/MasterSlaveSyncBucket.java81
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncBucket.java340
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncFeature.java137
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncItem.java75
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncItemList.java205
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncObject.java75
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncRegistry.java229
-rwxr-xr-xplugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncRequest.java85
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/NullSyncPolicy.java48
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncPolicyDelegateRegistryImpl.java91
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncService.java414
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncServiceOperation.java81
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncTriggerRegistry.java167
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/DefaultSyncPolicy.java77
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/ISyncPolicy.java73
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/ISyncPolicyDelegate.java105
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/SyncPolicyDelegate.java77
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/AbstractSyncTrigger.java33
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/CascadeTriggers.java92
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncAction.java24
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncService.java71
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncTrigger.java27
-rw-r--r--plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/SyncServiceRunnable.java93
-rw-r--r--plugins/infra/misc/pom.xml19
148 files changed, 19266 insertions, 0 deletions
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.classpath b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.classpath
new file mode 100644
index 00000000000..64c5e31b7a2
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.classpath
@@ -0,0 +1,7 @@
+<?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/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.project b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.project
new file mode 100644
index 00000000000..395ecbac5fc
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.infra.hyperlink</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.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..c585cc455ae
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,291 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+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_binary_expression=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_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=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_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=0
+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=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+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=true
+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=260
+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=4
+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_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not 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=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not 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_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_binary_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=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_lambda_arrow=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_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_unary_operator=do not 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_binary_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_lambda_arrow=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_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_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=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+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=260
+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=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+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_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.settings/org.eclipse.jdt.ui.prefs b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..954281dbc31
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,68 @@
+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=false
+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=false
+cleanup.format_source_code=false
+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=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=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=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_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_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_Papyrus
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_profile=_Papyrus
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+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\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><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">/**\n * Constructor.\n *\n * ${tags}\n */</template><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">/*****************************************************************************\n * Copyright (c) ${year} CEA LIST and others.\n * \n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * CEA LIST - Initial API and implementation\n * \n *****************************************************************************/\n</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><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">/**\n * ${see_to_overridden}\n *\n * ${tags}\n */</template><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">/**\n * ${see_to_target}\n *\n * ${tags}\n */</template><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}\n${package_declaration}\n\n${typecomment}\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">\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">\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">\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">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" 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}\n// ${todo} Auto-generated constructor stub</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>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/META-INF/MANIFEST.MF b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..32af3bfaf2e
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/META-INF/MANIFEST.MF
@@ -0,0 +1,36 @@
+Manifest-Version: 1.0
+Export-Package: org.eclipse.papyrus.infra.hyperlink,
+ org.eclipse.papyrus.infra.hyperlink.commands,
+ org.eclipse.papyrus.infra.hyperlink.helper,
+ org.eclipse.papyrus.infra.hyperlink.object,
+ org.eclipse.papyrus.infra.hyperlink.service,
+ org.eclipse.papyrus.infra.hyperlink.ui,
+ org.eclipse.papyrus.infra.hyperlink.util
+Require-Bundle: org.eclipse.emf.transaction,
+ org.eclipse.gmf.runtime.notation;bundle-version="1.8.0",
+ org.eclipse.papyrus.infra.emf;bundle-version="1.2.0",
+ org.eclipse.ui,
+ org.eclipse.ui.ide;bundle-version="3.8.0",
+ org.eclipse.papyrus.infra.core;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.core.log;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.widgets;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.emf.gmf;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.services.labelprovider;bundle-version="1.2.0",
+ org.eclipse.core.filesystem;bundle-version="1.3.200",
+ org.eclipse.papyrus.infra.services.openelement;bundle-version="1.2.0",
+ org.eclipse.papyrus.emf.facet.custom.ui;bundle-version="1.2.0",
+ org.eclipse.papyrus.emf.facet.custom.core;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.ui;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.core.sasheditor.di;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.core.sashwindows.di;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.ui.emf;bundle-version="1.2.0"
+Bundle-Vendor: %providerName
+Bundle-ActivationPolicy: lazy
+Bundle-Version: 1.2.0.qualifier
+Bundle-Name: %pluginName
+Bundle-Localization: plugin
+Bundle-ManifestVersion: 2
+Bundle-Activator: org.eclipse.papyrus.infra.hyperlink.Activator
+Bundle-Description: %pluginDescription
+Bundle-SymbolicName: org.eclipse.papyrus.infra.hyperlink;singleton:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/about.html b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/about.html
new file mode 100644
index 00000000000..dd3c089a94c
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/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>November 14, 2008</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> \ No newline at end of file
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/build.properties b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/build.properties
new file mode 100644
index 00000000000..a125ab2694e
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/build.properties
@@ -0,0 +1,10 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ schema/,\
+ about.html,\
+ plugin.xml,\
+ build.properties,\
+ plugin.properties
+src.includes = about.html
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowDown_16x16.gif b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowDown_16x16.gif
new file mode 100644
index 00000000000..072b1844572
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowDown_16x16.gif
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowLeft_16x16.gif b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowLeft_16x16.gif
new file mode 100644
index 00000000000..4fb41501036
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowLeft_16x16.gif
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowRight_16x16.gif b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowRight_16x16.gif
new file mode 100644
index 00000000000..19567890aa8
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowRight_16x16.gif
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowUp_16x16.gif b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowUp_16x16.gif
new file mode 100644
index 00000000000..07164754e5c
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/ArrowUp_16x16.gif
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/file.gif b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/file.gif
new file mode 100644
index 00000000000..ef302880717
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/file.gif
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/hyperlink.gif b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/hyperlink.gif
new file mode 100644
index 00000000000..1e09d979520
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/hyperlink.gif
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/insp_sbook.gif b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/insp_sbook.gif
new file mode 100644
index 00000000000..e936fbabfec
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/icons/insp_sbook.gif
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/plugin.properties b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/plugin.properties
new file mode 100644
index 00000000000..dfea23767cb
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/plugin.properties
@@ -0,0 +1,5 @@
+#Properties file for org.eclipse.papyrus.infra.hyperlink
+providerName = Eclipse Modeling Project
+pluginName = Papyrus Hyperlink
+extension-point.name = org.eclipse.papyrus.infra.hyperlink.registration
+pluginDescription=This plugin provides the dialog and the commands to add hyperlinks on an object. This plugin should not have dependencies on uml, gmf.notation.* and tables. \ No newline at end of file
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/plugin.xml b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/plugin.xml
new file mode 100644
index 00000000000..8f303867d31
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/plugin.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension-point id="org.eclipse.papyrus.infra.hyperlink.registration" name="%extension-point.name" schema="schema/org.eclipse.papyrus.infra.hyperlink.registration.exsd"/>
+ <extension-point id="org.eclipse.papyrus.infra.hyperlink.tab.registration" name="org.eclipse.papyrus.infra.hyperlink.tab.registration" schema="schema/org.eclipse.papyrus.infra.hyperlink.tab.registration.exsd"/>
+ <extension-point id="org.eclipse.papyrus.infra.hyperlink.specificHyperLinks" name="org.eclipse.papyrus.infra.hyperlink.specificHyperLinks" schema="schema/specificHyperLinks.exsd"/>
+ <extension-point id="org.eclipse.papyrus.infra.hyperlink.hyperlinkContributor" name="hyperlinkContributor" schema="schema/hyperlinkContributor.exsd"/>
+ <extension
+ point="org.eclipse.papyrus.infra.core.service">
+ <service
+ classname="org.eclipse.papyrus.infra.hyperlink.service.impl.HyperlinkServiceImpl"
+ id="org.eclipse.papyrus.infra.hyperlink.service.HyperlinkService"
+ priority="1"
+ startKind="lazy">
+ </service>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.papyrus.infra.core.sasheditor.preferences.generalcategory"
+ class="org.eclipse.papyrus.infra.hyperlink.preferences.HyperlinkServicePreferencesPage"
+ id="org.eclipse.papyrus.infra.hyperlink.preferences"
+ name="Hyperlink Service">
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.infra.hyperlink.registration">
+ <hyperlink
+ helper="org.eclipse.papyrus.infra.hyperlink.helper.ObjectHyperLinkHelper"
+ position="75"
+ tabId="org.eclipse.papyrus.infra.hyperlink.object">
+ </hyperlink>
+ <hyperlink
+ helper="org.eclipse.papyrus.infra.hyperlink.helper.DocumentHyperLinkHelper"
+ position="100"
+ tabId="org.eclipse.papyrus.infra.hyperlink.documenteditor">
+ </hyperlink>
+ <hyperlink
+ helper="org.eclipse.papyrus.infra.hyperlink.helper.WebHyperLinkHelper"
+ position="150"
+ tabId="org.eclipse.papyrus.infra.hyperlink.webeditor">
+ </hyperlink>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.infra.hyperlink.tab.registration">
+ <hyperlinktab
+ tabId="org.eclipse.papyrus.infra.hyperlink.defaulthyperlinktab"
+ position="200"
+ tab="org.eclipse.papyrus.infra.hyperlink.ui.DefaultHyperLinkTab">
+ </hyperlinktab>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.infra.services.labelprovider.labelProvider">
+ <labelProvider
+ priority="40"
+ provider="org.eclipse.papyrus.infra.hyperlink.util.HyperLinkFilteredLabelProvider">
+ </labelProvider>
+ </extension>
+</plugin>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/pom.xml b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/pom.xml
new file mode 100644
index 00000000000..4c41e49fef6
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/pom.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>org.eclipse.papyrus.infra-misc</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+ <artifactId>org.eclipse.papyrus.infra.hyperlink</artifactId>
+ <version>1.2.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/hyperlinkContributor.exsd b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/hyperlinkContributor.exsd
new file mode 100644
index 00000000000..5b93f0dc93b
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/hyperlinkContributor.exsd
@@ -0,0 +1,125 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.papyrus.infra.hyperlink" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.papyrus.infra.hyperlink" id="org.eclipse.papyrus.infra.hyperlink.hyperlinkContributor" name="hyperlinkContributor"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <choice>
+ <element ref="contributor"/>
+ </choice>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="contributor">
+ <complexType>
+ <attribute name="contributor" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.papyrus.infra.hyperlink.contributor.HyperlinkContributor"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="label" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/org.eclipse.papyrus.infra.hyperlink.registration.exsd b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/org.eclipse.papyrus.infra.hyperlink.registration.exsd
new file mode 100644
index 00000000000..28085599478
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/org.eclipse.papyrus.infra.hyperlink.registration.exsd
@@ -0,0 +1,124 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.papyrus.infra.hyperlink" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.papyrus.infra.hyperlink" id="org.eclipse.papyrus.infra.hyperlink.registration" name="org.eclipse.papyrus.infra.hyperlink.registration"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="hyperlink"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="hyperlink">
+ <annotation>
+ <documentation>
+ This extension point allows to register an helper. With this helper a new tab will be created, as the existing tabs Editor and Document.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="helper" type="string" use="required">
+ <annotation>
+ <documentation>
+ The class which implements the helper
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper:"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="position" type="string" use="required">
+ <annotation>
+ <documentation>
+ This string represents an integer. This integer is used to define the order of the tabs in the dialog. Papyrus takes each 50 positions to locate its tabs (50-100-150...)
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="tabId" type="string">
+ <annotation>
+ <documentation>
+ Hyperlinks contributed by helpers no longer have their own tabs; they are all consolidated into one tab.
+ </documentation>
+ <appinfo>
+ <meta.attribute deprecated="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/org.eclipse.papyrus.infra.hyperlink.tab.registration.exsd b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/org.eclipse.papyrus.infra.hyperlink.tab.registration.exsd
new file mode 100644
index 00000000000..b3fa5253393
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/org.eclipse.papyrus.infra.hyperlink.tab.registration.exsd
@@ -0,0 +1,121 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.papyrus.infra.hyperlink" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.papyrus.infra.hyperlink" id="org.eclipse.papyrus.infra.hyperlink.tab.registration" name="org.eclipse.papyrus.infra.hyperlink.tab.registration"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <choice>
+ <element ref="hyperlinktab"/>
+ </choice>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="hyperlinktab">
+ <annotation>
+ <documentation>
+ This extension point allows to register your own tab in the hyperlink dialog
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="tabId" type="string" use="required">
+ <annotation>
+ <documentation>
+ The id of your tab. This id should be unique.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="tab" type="string" use="required">
+ <annotation>
+ <documentation>
+ The class which implements your tab.
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.papyrus.infra.hyperlink.ui.AbstractHyperLinkTab:"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="position" type="string" use="required">
+ <annotation>
+ <documentation>
+ The position of your tab.The papyrus tabs take each 50* positions (50-100-150,...)
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/specificHyperLinks.exsd b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/specificHyperLinks.exsd
new file mode 100644
index 00000000000..72decce84ec
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/schema/specificHyperLinks.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.papyrus.infra.hyperlink" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.papyrus.infra.hyperlink" id="specificHyperLinks" name="specificHyperLinks"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="specificHyperLink"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="specificHyperLink">
+ <complexType>
+ <attribute name="contentProvider" type="string" use="required">
+ <annotation>
+ <documentation>
+ The contribution to the SpecificObjectHyperLink content provider
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.jface.viewers.ITreeContentProvider"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/Activator.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/Activator.java
new file mode 100644
index 00000000000..54416b37cea
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/Activator.java
@@ -0,0 +1,88 @@
+/*****************************************************************************
+ * Copyright (c) 2011, 2016 CEA LIST, Christian W. Damus, 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:
+ * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 485220
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink;
+
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.papyrus.infra.hyperlink"; //$NON-NLS-1$
+
+ public static final String IMG_LOUPE = "loupe"; //$NON-NLS-1$
+
+ public static final String IMG_ARROW_UP = "arrowUp"; //$NON-NLS-1$
+
+ public static final String IMG_ARROW_DOWN = "arrowDown"; //$NON-NLS-1$
+
+ public static final String IMG_ARROW_LEFT = "arrowLeft"; //$NON-NLS-1$
+
+ public static final String IMG_ARROW_RIGHT = "arrowRight"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /** Logging helper */
+ public static LogHelper log;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ log = new LogHelper(this);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ @Override
+ protected void initializeImageRegistry(ImageRegistry reg) {
+ super.initializeImageRegistry(reg);
+
+ reg.put(IMG_LOUPE, imageDescriptorFromPlugin(PLUGIN_ID, "icons/insp_sbook.gif")); //$NON-NLS-1$
+ reg.put(IMG_ARROW_UP, imageDescriptorFromPlugin(PLUGIN_ID, "icons/ArrowUp_16x16.gif")); //$NON-NLS-1$
+ reg.put(IMG_ARROW_DOWN, imageDescriptorFromPlugin(PLUGIN_ID, "icons/ArrowDown_16x16.gif")); //$NON-NLS-1$
+ reg.put(IMG_ARROW_LEFT, imageDescriptorFromPlugin(PLUGIN_ID, "icons/ArrowLeft_16x16.gif")); //$NON-NLS-1$
+ reg.put(IMG_ARROW_RIGHT, imageDescriptorFromPlugin(PLUGIN_ID, "icons/ArrowRight_16x16.gif")); //$NON-NLS-1$
+ }
+
+ public Image getIcon(String key) {
+ return getImageRegistry().get(key);
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/AbstractDeleteHyperLinkCommand.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/AbstractDeleteHyperLinkCommand.java
new file mode 100644
index 00000000000..a4e57381773
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/AbstractDeleteHyperLinkCommand.java
@@ -0,0 +1,83 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+
+/**
+ *
+ * An abstract class to remove eannotation
+ *
+ */
+public abstract class AbstractDeleteHyperLinkCommand extends RecordingCommand {
+
+ /**
+ * the edited object
+ */
+ private final EModelElement object;
+
+ /**
+ *
+ * Constructor.
+ *
+ * @param domain
+ * the editing domain for this command
+ * @param object
+ * the edited EModelElement
+ */
+ public AbstractDeleteHyperLinkCommand(final TransactionalEditingDomain domain, final EModelElement object) {
+ super(domain);
+ this.object = object;
+ }
+
+ /**
+ *
+ * @see org.eclipse.emf.transaction.RecordingCommand#doExecute()
+ *
+ */
+ @Override
+ protected void doExecute() {
+ // remove annotations
+ for (EAnnotation current : getEAnnotationsToRemove()) {
+ this.object.getEAnnotations().remove(current);
+ }
+
+ }
+
+ /**
+ *
+ * @return
+ * the list of the EAnnotation to remove
+ */
+ protected List<EAnnotation> getEAnnotationsToRemove() {
+ List<EAnnotation> toRemove = new ArrayList<EAnnotation>();
+ return toRemove;
+ }
+
+ /**
+ * Getter for {@link this#object}
+ *
+ * @return
+ */
+ protected EModelElement getObject() {
+ return this.object;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkDocumentCommand.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkDocumentCommand.java
new file mode 100644
index 00000000000..ef7e4e68a99
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkDocumentCommand.java
@@ -0,0 +1,72 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.commands;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.emf.commands.CreateEAnnotationCommand;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+
+/**
+ * The Class CreateHyperLinkCommand. this has in charge to add a new entry list
+ * of hyperlinks
+ *
+ */
+public class CreateHyperLinkDocumentCommand extends CreateEAnnotationCommand {
+
+ /** The hyperlink kind. */
+ public String tooltiptext;
+
+ /** The localization. */
+ public String localization;
+
+ /** to set if is a default hyperlink */
+ public boolean isDefault;
+
+ /**
+ * Instantiates a new creates the hyper link command.
+ *
+ * @param domain
+ * the domain
+ * @param object
+ * the object for example the view
+ * @param tooltiptext
+ * the hyperlink kind see {@link VisualInformationPapyrusConstant}
+ * @param localization
+ * the localization
+ * @param isDefault
+ * to set this hyperlink as default
+ */
+ public CreateHyperLinkDocumentCommand(TransactionalEditingDomain domain, EModelElement object, String tooltiptext, String localization, boolean isDefault) {
+ super(domain, object, HyperLinkConstants.HYPERLINK_DOCUMENT);
+ this.tooltiptext = tooltiptext;
+ this.localization = localization;
+ this.isDefault = isDefault;
+ }
+
+ /**
+ * {@inheritedDoc}
+ */
+ @Override
+ protected void doExecute() {
+ EAnnotation eAnnotation = createEAnnotation();
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_TOOLTYPE_TEXT, this.tooltiptext);
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_DOCUMENT_LOCALIZATION, this.localization);
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_IS_DEFAULT_NAVIGATION, "" + this.isDefault); //$NON-NLS-1$
+ attachEannotation(eAnnotation, getObject());
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkObjectCommand.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkObjectCommand.java
new file mode 100644
index 00000000000..e415a907817
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkObjectCommand.java
@@ -0,0 +1,56 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST.
+ *
+ *
+ * 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:
+ * Camille Letavernier (camille.letavernier@cea.fr) - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.commands;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.emf.commands.CreateEAnnotationCommand;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+
+public class CreateHyperLinkObjectCommand extends CreateEAnnotationCommand {
+
+ public String tooltiptext;
+
+ public String name;
+
+ private EObject targetElement;
+
+ protected boolean isDefaultNavigation;
+
+
+ public CreateHyperLinkObjectCommand(TransactionalEditingDomain domain, EModelElement object, String tooltiptext, String name, EObject targetElement, boolean isDefaultNavigation) {
+ super(domain, object, HyperLinkConstants.PAPYRUS_HYPERLINK_SPECIFIC_ELEMENT);
+ this.tooltiptext = tooltiptext;
+ this.name = name;
+ this.targetElement = targetElement;
+ this.isDefaultNavigation = isDefaultNavigation;
+ }
+
+ /**
+ * {@inheritedDoc}
+ */
+ @Override
+ protected void doExecute() {
+ EAnnotation eAnnotation = createEAnnotation();
+ eAnnotation.getReferences().add(targetElement);
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_TOOLTYPE_TEXT, this.tooltiptext);
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_PAGE_NAME, this.name);
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_IS_DEFAULT_NAVIGATION, Boolean.toString(this.isDefaultNavigation));
+ attachEannotation(eAnnotation, getObject());
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkPageCommand.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkPageCommand.java
new file mode 100644
index 00000000000..5162cb714c8
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkPageCommand.java
@@ -0,0 +1,78 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.commands;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.emf.commands.CreateEAnnotationCommand;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+/**
+ * The Class CreateHyperLinkCommand. this has in charge to add a new entry list
+ * of hyperlinks
+ *
+ */
+public class CreateHyperLinkPageCommand extends CreateEAnnotationCommand {
+
+ /** The hyperlink kind. */
+ public String tooltiptext;
+
+ /** The localization. */
+ public String name;
+
+ /**
+ * The pageIdentifier to open
+ */
+ private EObject pageIdentifier;
+
+ protected boolean isDefaultNavigation;
+
+ /**
+ * Instantiates a new creates the hyper link command.
+ *
+ * @param domain
+ * the domain
+ * @param object
+ * the object for example the view
+ * @param tooltiptext
+ * the hyperlink kind see {@link UMLVisualInformationPapyrusConstant}
+ * @param name
+ * the localization
+ * @param pageIdentifier
+ * @param isDefaultNavigation
+ */
+ public CreateHyperLinkPageCommand(TransactionalEditingDomain domain, EModelElement object, String tooltiptext, String name, EObject pageIdentifier, boolean isDefaultNavigation) {
+ super(domain, object, HyperLinkConstants.PAPYRUS_HYPERLINK_PAGE);
+ this.tooltiptext = tooltiptext;
+ this.name = name;
+ this.pageIdentifier = pageIdentifier;
+ this.isDefaultNavigation = isDefaultNavigation;
+ }
+
+ /**
+ * {@inheritedDoc}
+ */
+ @Override
+ protected void doExecute() {
+ EAnnotation eAnnotation = createEAnnotation();
+ eAnnotation.getReferences().add(pageIdentifier);
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_TOOLTYPE_TEXT, this.tooltiptext);
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_PAGE_NAME, this.name);
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_IS_DEFAULT_NAVIGATION, Boolean.toString(this.isDefaultNavigation));
+ attachEannotation(eAnnotation, getObject());
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkWebCommand.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkWebCommand.java
new file mode 100644
index 00000000000..27594eec363
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/CreateHyperLinkWebCommand.java
@@ -0,0 +1,72 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.commands;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.emf.commands.CreateEAnnotationCommand;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+
+/**
+ * The Class CreateHyperLinkCommand. this has in charge to add a new entry list
+ * of hyperlinks
+ *
+ */
+public class CreateHyperLinkWebCommand extends CreateEAnnotationCommand {
+
+ /** The hyperlink kind. */
+ public String tooltiptext;
+
+ /** The localization. */
+ public String link;
+
+ /** to set if is a default hyperlink */
+ public boolean isDefault;
+
+ /**
+ * Instantiates a new creates the hyper link command.
+ *
+ * @param domain
+ * the domain
+ * @param object
+ * the object for example the view
+ * @param tooltiptext
+ * the hyperlink kind see {@link VisualInformationPapyrusConstant}
+ * @param link
+ * the localization
+ * @param isDefault
+ * to set this hyperlink as default
+ */
+ public CreateHyperLinkWebCommand(TransactionalEditingDomain domain, EModelElement object, String tooltiptext, String link, boolean isDefault) {
+ super(domain, object, HyperLinkConstants.HYPERLINK_WEB);
+ this.tooltiptext = tooltiptext;
+ this.link = link;
+ this.isDefault = isDefault;
+ }
+
+ /**
+ * {@inheritedDoc}
+ */
+ @Override
+ protected void doExecute() {
+ EAnnotation eAnnotation = createEAnnotation();
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_TOOLTYPE_TEXT, this.tooltiptext);
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_WEB_LINK, this.link);
+ eAnnotation.getDetails().put(HyperLinkConstants.HYPERLINK_IS_DEFAULT_NAVIGATION, "" + this.isDefault); //$NON-NLS-1$
+ attachEannotation(eAnnotation, getObject());
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/DeleteHyperLinkDocumentCommand.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/DeleteHyperLinkDocumentCommand.java
new file mode 100644
index 00000000000..16056236983
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/DeleteHyperLinkDocumentCommand.java
@@ -0,0 +1,73 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.commands;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+
+/**
+ * The Class DeleteHyperLinkCommand. it can be used also to remove an hyperlink
+ * web. It will remove the first eannotation that corresponds to the link or the
+ * localization of the hyperlink
+ */
+
+public class DeleteHyperLinkDocumentCommand extends AbstractDeleteHyperLinkCommand {
+
+ /** The localization. */
+ public String link;
+
+ /**
+ * Instantiates a new delete hyper link command used to suppress a link in
+ * the view
+ *
+ * @param domain
+ * the domain
+ * @param object
+ * the object
+ * @param link
+ * the localization of the link
+ */
+ public DeleteHyperLinkDocumentCommand(TransactionalEditingDomain domain, EModelElement object, String link) {
+ super(domain, object);// TODO an error?
+ this.link = link;
+ }
+
+ /**
+ *
+ * @see org.eclipse.papyrus.infra.hyperlink.commands.AbstractDeleteHyperLinkCommand#getEAnnotationsToRemove()
+ *
+ * @return
+ */
+ @Override
+ protected List<EAnnotation> getEAnnotationsToRemove() {
+ List<EAnnotation> toRemove = super.getEAnnotationsToRemove();
+ Iterator<EAnnotation> iter = getObject().getEAnnotations().iterator();
+ // look for interesting eannotations
+ while (iter.hasNext()) {
+ EAnnotation currentAnnotation = iter.next();
+ if (currentAnnotation.getSource().equals(HyperLinkConstants.HYPERLINK_DOCUMENT) || currentAnnotation.getSource().equals(HyperLinkConstants.HYPERLINK_WEB)) {
+ if (currentAnnotation.getDetails().containsValue(link)) {
+ toRemove.add(currentAnnotation);
+ }
+ }
+ }
+ return toRemove;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/DeleteHyperLinkPageCommand.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/DeleteHyperLinkPageCommand.java
new file mode 100644
index 00000000000..c8bdc8fb942
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/DeleteHyperLinkPageCommand.java
@@ -0,0 +1,75 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Refactoring & simplification
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.commands;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+
+/**
+ * The Class DeleteHyperLinkCommand. it can be used also to remove an hyperlink
+ * web. It will remove the first eannotation that corresponds to the link or the
+ * localization of the hyperlink
+ */
+public class DeleteHyperLinkPageCommand extends RecordingCommand {
+
+ /** The hyperlink target. */
+ protected EObject page;
+
+ protected EModelElement sourceElement;
+
+ /**
+ * Instantiates a new delete hyper link command used to suppress a link in
+ * the view
+ *
+ * @param domain
+ * the domain
+ * @param object
+ * the object
+ * @param page
+ * the target of the link
+ */
+ public DeleteHyperLinkPageCommand(TransactionalEditingDomain domain, EModelElement object, EObject page) {
+ super(domain);
+ this.page = page;
+ this.sourceElement = object;
+ }
+
+ /**
+ * {@inheritedDoc}
+ */
+ @Override
+ protected void doExecute() {
+ Iterator<EAnnotation> iter = sourceElement.getEAnnotations().iterator();
+
+ // Remove interesting eannotations
+ while (iter.hasNext()) {
+ EAnnotation currentAnnotation = iter.next();
+ for (String annotationName : HyperLinkConstants.validHyperLinkPageSources) {
+ if (annotationName.equals(currentAnnotation.getSource())) {
+ if (currentAnnotation.getReferences().contains(page)) {
+ iter.remove();
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/EmptyAllHyperLinkCommand.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/EmptyAllHyperLinkCommand.java
new file mode 100644
index 00000000000..2540f1e4f1d
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/commands/EmptyAllHyperLinkCommand.java
@@ -0,0 +1,68 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.commands;
+
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+/**
+ * The Class DeleteHyperLinkCommand. it can be used also to remove an hyperlink
+ * web. It will remove the first eannotation that corresponds to the link or the
+ * localization of the hyperlink
+ */
+public class EmptyAllHyperLinkCommand extends AbstractDeleteHyperLinkCommand {
+
+ /**
+ * Instantiates a new delete hyper link command used to suppress a link in
+ * the view
+ *
+ * @param domain
+ * the domain
+ * @param object
+ * the object
+ * @param link
+ * the localization of the link
+ */
+ public EmptyAllHyperLinkCommand(TransactionalEditingDomain domain, EModelElement object) {
+ super(domain, object);
+ }
+
+ /**
+ *
+ * @see org.eclipse.papyrus.infra.hyperlink.commands.AbstractDeleteHyperLinkCommand#getEAnnotationsToRemove()
+ *
+ * @return
+ */
+ @Override
+ protected List<EAnnotation> getEAnnotationsToRemove() {
+ List<EAnnotation> toRemove = super.getEAnnotationsToRemove();
+ Iterator<EAnnotation> iter = getObject().getEAnnotations().iterator();
+ // look for interesting eannotations
+ while (iter.hasNext()) {
+ EAnnotation currentAnnotation = iter.next();
+ String source = currentAnnotation.getSource();
+ if (source.startsWith(HyperLinkConstants.PAPYRUS_HYPERLINK_PREFIX)) {
+ toRemove.add(currentAnnotation);
+ }
+ }
+ return toRemove;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/AbstractHyperLinkHelper.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/AbstractHyperLinkHelper.java
new file mode 100644
index 00000000000..00ed44b4892
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/AbstractHyperLinkHelper.java
@@ -0,0 +1,121 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.hyperlink.helper;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+
+/**
+ * this class is an abstract helper used to serialize and deserialize a HyperLink Object
+ *
+ */
+public abstract class AbstractHyperLinkHelper {
+
+ /**
+ * the id of the tab
+ */
+ private String tabid;
+
+ /**
+ * Getter for this{@link #tabid}
+ *
+ * @return
+ * this{@link #tabid}
+ */
+ public final String getTabId() {
+ return this.tabid;
+ }
+
+ /**
+ * Setter for this{@link #tabid}
+ *
+ * @param tabId
+ * the id of the tab
+ */
+ public final void setTabId(final String tabId) {
+ this.tabid = tabId;
+ }
+
+ /**
+ *
+ * @return as string of the kind of hyperlink to display
+ */
+ public abstract String getNameofManagedHyperLink();
+
+ /**
+ * this method is called in order to create an HyperLinkObject and add into
+ * a given HyperLinkObject list
+ *
+ * @param list
+ * a list of hyperlink Object
+ * @param aModel
+ * TODO
+ */
+ // TODO remove this method
+ public abstract void executeNewMousePressed(List<HyperLinkObject> list, EObject aModel);
+
+
+ /**
+ * this method is called in order to edit an HyperLinkObject and add into a
+ * given HyperLinkObject list
+ *
+ * @param list
+ * a list of hyperlink Object
+ * @param amodel
+ * the root model
+ * @param HyperLinkObject
+ * the HyperLinkObject to edit
+ */
+ public void executeEditMousePressed(List<HyperLinkObject> list, HyperLinkObject HyperLinkObject, EObject amodel) {
+ HyperLinkObject.executeEditMousePressed(list, amodel);
+ }
+
+ /**
+ * from a list of hyperlinks, it return a list of hyperlink with the same
+ * kind. for example return a list of diagramhyperlink
+ *
+ * @param HyperLinkObjects
+ * the list of HyperLinkObjects
+ * @return a list of hyperlink object with the same kind
+ */
+ public abstract List<HyperLinkObject> getFilteredObject(List<HyperLinkObject> HyperLinkObjects);
+
+ /**
+ *
+ * @param eAnnotation
+ * that represents a hyperlink object
+ * @return the hyperlink object from the eannotation
+ */
+ public abstract HyperLinkObject getHyperLinkObject(EAnnotation eAnnotation);
+
+ /**
+ * get a command to serailize a hyperlink object
+ *
+ * @param domain
+ * the editing domain
+ * @param object
+ * the EModelElement to which the hyperlink as attached
+ * @param HyperLinkObject
+ * the HyperLinkObject to serailize
+ * @return the command in charge of the serialization
+ */
+ public abstract RecordingCommand getAddHyperLinkCommand(TransactionalEditingDomain domain, EModelElement object, HyperLinkObject HyperLinkObject);
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/CompositeHyperlinkHelper.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/CompositeHyperlinkHelper.java
new file mode 100644
index 00000000000..75cc7b17f75
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/CompositeHyperlinkHelper.java
@@ -0,0 +1,118 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST 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:
+ * CEA LIST - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.helper;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+
+
+/**
+ * This is the CompositeHyperlinkHelper type. Enjoy.
+ */
+public class CompositeHyperlinkHelper extends AbstractHyperLinkHelper {
+
+ private final AbstractHyperLinkHelper[] helpers;
+
+ private final Map<HyperLinkObject, AbstractHyperLinkHelper> hyperlinks = new java.util.HashMap<HyperLinkObject, AbstractHyperLinkHelper>();
+
+ private AbstractHyperLinkHelper activeHelper;
+
+ public CompositeHyperlinkHelper(Collection<? extends AbstractHyperLinkHelper> helpers) {
+ this.helpers = helpers.toArray(new AbstractHyperLinkHelper[helpers.size()]);
+
+ if (this.helpers.length > 0) {
+ this.activeHelper = this.helpers[0];
+ }
+ }
+
+ @Override
+ public String getNameofManagedHyperLink() {
+ return "Various";
+ }
+
+ public List<? extends AbstractHyperLinkHelper> getHelpers() {
+ return Collections.unmodifiableList(Arrays.asList(helpers));
+ }
+
+ public void setActiveHelper(AbstractHyperLinkHelper helper) {
+ if (!Arrays.asList(helpers).contains(helper)) {
+ throw new IllegalArgumentException("not a composed helper");
+ }
+
+ activeHelper = helper;
+ }
+
+ @Override
+ public void executeNewMousePressed(List<HyperLinkObject> list, EObject aModel) {
+ if (activeHelper != null) {
+ final int originalSize = list.size();
+ activeHelper.executeNewMousePressed(list, aModel);
+
+ // remember the helper that created these hyperlinks; we may need it later
+ for (int i = originalSize; i < list.size(); i++) {
+ hyperlinks.put(list.get(i), activeHelper);
+ }
+ }
+ }
+
+ @Override
+ public List<HyperLinkObject> getFilteredObject(List<HyperLinkObject> hyperLinkObjects) {
+ // return result of list type suggests that ordering is important
+ Set<HyperLinkObject> result = new java.util.LinkedHashSet<HyperLinkObject>();
+
+ for (int i = 0; i < helpers.length; i++) {
+ result.addAll(helpers[i].getFilteredObject(hyperLinkObjects));
+ }
+
+ return new java.util.ArrayList<HyperLinkObject>(result);
+ }
+
+ @Override
+ public HyperLinkObject getHyperLinkObject(EAnnotation eAnnotation) {
+ HyperLinkObject result = null;
+
+ for (int i = 0; (result == null) && (i < helpers.length); i++) {
+ result = helpers[i].getHyperLinkObject(eAnnotation);
+
+ if (result != null) {
+ // remember the helper that created this hyperlink; we may need it later
+ hyperlinks.put(result, helpers[i]);
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public RecordingCommand getAddHyperLinkCommand(TransactionalEditingDomain domain, EModelElement object, HyperLinkObject hyperLinkObject) {
+ RecordingCommand result = null;
+ AbstractHyperLinkHelper helper = hyperlinks.get(hyperLinkObject);
+
+ if (helper != null) {
+ result = helper.getAddHyperLinkCommand(domain, object, hyperLinkObject);
+ }
+
+ return result;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/DocumentHyperLinkHelper.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/DocumentHyperLinkHelper.java
new file mode 100644
index 00000000000..e32d3924752
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/DocumentHyperLinkHelper.java
@@ -0,0 +1,98 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.hyperlink.helper;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.hyperlink.commands.CreateHyperLinkDocumentCommand;
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkDocument;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.hyperlink.ui.EditorHyperlinkDocumentShell;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+
+
+/**
+ * this an helper to manage hyperlink document
+ *
+ */
+public class DocumentHyperLinkHelper extends AbstractHyperLinkHelper {
+
+
+ @Override
+ public HyperLinkObject getHyperLinkObject(EAnnotation eAnnotation) {
+ if (eAnnotation.getSource().equals(HyperLinkConstants.HYPERLINK_DOCUMENT)) {
+ HyperLinkDocument hyperLinkDocument = new HyperLinkDocument();
+ hyperLinkDocument.setHyperlinkDocument(eAnnotation.getDetails().get(HyperLinkConstants.HYPERLINK_DOCUMENT_LOCALIZATION));
+ hyperLinkDocument.setTooltipText(eAnnotation.getDetails().get(HyperLinkConstants.HYPERLINK_TOOLTYPE_TEXT));
+ if (eAnnotation.getDetails().get(HyperLinkConstants.HYPERLINK_IS_DEFAULT_NAVIGATION) != null) {
+ boolean isDefaultNaviagation = Boolean.parseBoolean(eAnnotation.getDetails().get(HyperLinkConstants.HYPERLINK_IS_DEFAULT_NAVIGATION));
+ hyperLinkDocument.setIsDefault(isDefaultNaviagation);
+ } else {
+ hyperLinkDocument.setIsDefault(false);
+ }
+
+ return hyperLinkDocument;
+ }
+
+ return null;
+ }
+
+ @Override
+ public RecordingCommand getAddHyperLinkCommand(TransactionalEditingDomain domain, EModelElement object, HyperLinkObject hyperlinkObject) {
+ if (hyperlinkObject instanceof HyperLinkDocument) {
+ HyperLinkDocument hyperLinkDocument = (HyperLinkDocument) hyperlinkObject;
+ return new CreateHyperLinkDocumentCommand(domain, object, hyperLinkDocument.getTooltipText(), hyperLinkDocument.getHyperlinkDocument(), hyperlinkObject.getIsDefault());
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getNameofManagedHyperLink() {
+ return Messages.DocumentHyperLinkHelper_Document;
+ }
+
+ @Override
+ public void executeNewMousePressed(List<HyperLinkObject> list, EObject aModel) {
+ EditorHyperlinkDocumentShell editor = new EditorHyperlinkDocumentShell();
+ editor.open();
+ if (editor.getHyperlinkDocument() != null) {
+ list.add(editor.getHyperlinkDocument());
+ }
+
+ }
+
+ @Override
+ public List<HyperLinkObject> getFilteredObject(List<HyperLinkObject> hyperlinkObjects) {
+ ArrayList<HyperLinkObject> result = new ArrayList<HyperLinkObject>();
+ Iterator<HyperLinkObject> iterator = hyperlinkObjects.iterator();
+ while (iterator.hasNext()) {
+ HyperLinkObject hyperlinkObject = iterator.next();
+ if (hyperlinkObject instanceof HyperLinkDocument) {
+ result.add(hyperlinkObject);
+ }
+ }
+ return result;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/HyperLinkHelperFactory.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/HyperLinkHelperFactory.java
new file mode 100644
index 00000000000..ecb1dfe0e66
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/HyperLinkHelperFactory.java
@@ -0,0 +1,143 @@
+/*****************************************************************************
+ * Copyright (c) 2009-2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.helper;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.hyperlink.commands.DeleteHyperLinkDocumentCommand;
+import org.eclipse.papyrus.infra.hyperlink.commands.EmptyAllHyperLinkCommand;
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkException;
+
+
+/**
+ * The Class HyperlinkHelper, contains all methods to manipulate information
+ * about hyperlinks in a model
+ */
+public class HyperLinkHelperFactory {
+
+ protected List<AbstractHyperLinkHelper> hyperLinkHelpers = new ArrayList<AbstractHyperLinkHelper>();
+
+ public List<AbstractHyperLinkHelper> getHyperLinkHelpers() {
+ return hyperLinkHelpers;
+ }
+
+ public HyperLinkHelperFactory(List<AbstractHyperLinkHelper> hyperLinkHelpers) {
+ this.hyperLinkHelpers.clear();
+ this.hyperLinkHelpers.addAll(hyperLinkHelpers);
+ }
+
+ /**
+ * Gets the adds the hyper link command.
+ *
+ * @param domain
+ * the domain to execute command
+ * @param object
+ * the object where it is attached the information
+ * @param localization
+ * the localization of the document
+ * @param tooltipText
+ * the tooltip text
+ * @param isDefault
+ * to set this hyperlink as default
+ * @return the adds the hyper link command
+ */
+ public Command getAddHyperLinkCommand(TransactionalEditingDomain domain, EModelElement object, List<HyperLinkObject> hyperlinkObjects) throws HyperLinkException {
+ CompoundCommand cmpCommand = new CompoundCommand(Messages.HyperLinkHelperFactory_addHyperLinksCommand);
+ Iterator<HyperLinkObject> iterator = hyperlinkObjects.iterator();
+ while (iterator.hasNext()) {
+ HyperLinkObject hyperlinkObject = iterator.next();
+ RecordingCommand cmd = null;
+ int i = 0;
+ while (cmd == null && i < hyperLinkHelpers.size()) {
+ cmd = hyperLinkHelpers.get(i).getAddHyperLinkCommand(domain, object, hyperlinkObject);
+ i++;
+ }
+ if (cmd == null) {
+ throw new HyperLinkException(Messages.HyperLinkHelperFactory_ImpossibleToFindACommandToSerialize + hyperlinkObject);
+ }
+ cmpCommand.append(cmd);
+ }
+ return cmpCommand.isEmpty() ? null : cmpCommand;
+ }
+
+ /**
+ * use to remove a hyperlink web or document
+ *
+ * @param domain
+ * the domain to execute the command
+ * @param object
+ * the object where was attached the information
+ * @param localization
+ * the localization or link
+ *
+ * @return the removes the element command
+ */
+ public static RecordingCommand getRemoveHyperlinkCommand(TransactionalEditingDomain domain, EModelElement object, String localization) {
+ return new DeleteHyperLinkDocumentCommand(domain, object, localization);
+
+ }
+
+ /**
+ * Gets the allreferenced element.
+ *
+ * @param object
+ * the object where we look for information
+ *
+ * @return the allreferenced
+ */
+ public ArrayList<?> getAllreferenced(EModelElement object) throws HyperLinkException {
+ ArrayList<HyperLinkObject> result = new ArrayList<HyperLinkObject>();
+ Iterator<EAnnotation> iter = object.getEAnnotations().iterator();
+ while (iter.hasNext()) {
+ EAnnotation currentAnnotation = iter.next();
+ int i = 0;
+ HyperLinkObject hyperlinkObject = null;
+ while (hyperlinkObject == null && i < hyperLinkHelpers.size()) {
+ hyperlinkObject = hyperLinkHelpers.get(i).getHyperLinkObject(currentAnnotation);
+ i++;
+ }
+ if (hyperlinkObject != null) {
+ result.add(hyperlinkObject);
+ }
+ }
+
+ return result;
+
+ }
+
+ /**
+ * Gets the empty all hyper link command. to clean all hyperlinks
+ *
+ * @param domain
+ * the domain to execute the command
+ * @param object
+ * the object where is attached information
+ *
+ * @return the empty all hyper link command
+ */
+ public static EmptyAllHyperLinkCommand getEmptyAllHyperLinkCommand(TransactionalEditingDomain domain, EModelElement object) {
+ return new EmptyAllHyperLinkCommand(domain, object);
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/IHyperlinkHelperExtension.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/IHyperlinkHelperExtension.java
new file mode 100644
index 00000000000..580d7d02d9f
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/IHyperlinkHelperExtension.java
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST 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:
+ * CEA LIST - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.helper;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+
+
+/**
+ * An optional interface implemented by {@link AbstractHyperLinkHelper}s that can recognize an
+ * object that they handle and create a {@link Command} to create a hyperlink to it.
+ */
+public interface IHyperlinkHelperExtension {
+
+ /**
+ * Obtains a command, if possible, that creates a hyperlink from a prospective {@code linkOwner} to a {@code linkTarget}.
+ *
+ * @param domain
+ * the transactional editing domain in which to create the command
+ * @param linkOwner
+ * the object in which to create the hyperlink
+ * @param linkTarget
+ * the object to which to establish the hyperlink
+ *
+ * @return the command, or {@code null} if I do not know how to create a command to link to this target
+ *
+ * @see AbstractHyperLinkHelper#getAddHyperLinkCommand(TransactionalEditingDomain, EModelElement, org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject)
+ */
+ Command getCreateHyperlinkCommand(TransactionalEditingDomain domain, EModelElement linkOwner, Object linkTarget);
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/ObjectHyperLinkHelper.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/ObjectHyperLinkHelper.java
new file mode 100644
index 00000000000..f52e4158fda
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/ObjectHyperLinkHelper.java
@@ -0,0 +1,161 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST.
+ *
+ *
+ * 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:
+ * Camille Letavernier (camille.letavernier@cea.fr) - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.helper;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.sashwindows.di.service.IPageManager;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.commands.CreateHyperLinkObjectCommand;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkSpecificObject;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.papyrus.infra.ui.emf.providers.EMFGraphicalContentProvider;
+import org.eclipse.papyrus.infra.widgets.editors.TreeSelectorDialog;
+import org.eclipse.papyrus.infra.widgets.providers.CompositeContentProvider;
+import org.eclipse.papyrus.infra.widgets.providers.ICompositeContentProvider;
+import org.eclipse.papyrus.infra.widgets.providers.IHierarchicContentProvider;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * An Hyperlink Helper for referencing objects (i.e. specific object within an
+ * editor, such as a Specific Class in a Class Diagram)
+ *
+ * @author Camille Letavernier
+ *
+ */
+public class ObjectHyperLinkHelper extends AbstractHyperLinkHelper {
+
+ @Override
+ public String getNameofManagedHyperLink() {
+ return "Specific object";
+ }
+
+ @Override
+ public void executeNewMousePressed(List<HyperLinkObject> list, EObject aModel) {
+ ServicesRegistry servicesRegistry;
+ LabelProviderService labelProviderService;
+ ModelSet modelSet;
+ try {
+ servicesRegistry = ServiceUtilsForEObject.getInstance().getServiceRegistry(aModel);
+ if (servicesRegistry == null) {
+ return;
+ }
+
+ labelProviderService = servicesRegistry.getService(LabelProviderService.class);
+ modelSet = servicesRegistry.getService(ModelSet.class);
+ } catch (ServiceException e) {
+ Activator.log.error(e);
+ return;
+ }
+
+ // Create and opens a dialog for page models
+ TreeSelectorDialog selectionDialog = new TreeSelectorDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+ selectionDialog.setBlockOnOpen(true);
+
+ IHierarchicContentProvider semanticProvider = getContentProvider();
+ ITreeContentProvider graphicalProvider = new EMFGraphicalContentProvider(semanticProvider, modelSet, Activator.PLUGIN_ID + ".specificHyperLinks");
+
+ selectionDialog.setContentProvider(graphicalProvider);
+ selectionDialog.setLabelProvider(labelProviderService.getLabelProvider());
+ selectionDialog.setInput(aModel);
+ selectionDialog.open();
+ if (selectionDialog.getReturnCode() == Window.OK) {
+ Object[] result = selectionDialog.getResult();
+ for (Object resultElement : result) {
+ if (resultElement instanceof EObject) {
+ list.add(new HyperLinkSpecificObject((EObject) resultElement));
+ }
+ }
+ }
+ }
+
+ public static final String EXTENSION_ID = Activator.PLUGIN_ID + ".specificHyperLinks";
+
+ protected IHierarchicContentProvider getContentProvider() {
+ ICompositeContentProvider provider = new CompositeContentProvider();
+
+ IConfigurationElement[] configElements = Platform.getExtensionRegistry().getConfigurationElementsFor(EXTENSION_ID);
+
+ for (IConfigurationElement e : configElements) {
+ try {
+ Object contentProviderObject = e.createExecutableExtension("contentProvider");
+ if (!(contentProviderObject instanceof ITreeContentProvider)) {
+ Activator.log.warn("Plugin " + e.getContributor() + " contributed an invalid extension for " + EXTENSION_ID + ". The content provider must be a ITreeContentProvider");
+ continue;
+ }
+
+ ITreeContentProvider contentProvider = (ITreeContentProvider) contentProviderObject;
+ provider.appendContentProvider(contentProvider);
+ } catch (Exception ex) {
+ Activator.log.error("Plugin " + e.getContributor() + " contributed an invalid extension for " + EXTENSION_ID, ex);
+ }
+ }
+
+ return provider;
+ }
+
+ @Override
+ public List<HyperLinkObject> getFilteredObject(List<HyperLinkObject> hyperLinkObjects) {
+ List<HyperLinkObject> result = new LinkedList<HyperLinkObject>();
+ for (HyperLinkObject object : hyperLinkObjects) {
+ if (object instanceof HyperLinkSpecificObject) {
+ result.add(object);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public HyperLinkObject getHyperLinkObject(EAnnotation eAnnotation) {
+ if (HyperLinkConstants.PAPYRUS_HYPERLINK_SPECIFIC_ELEMENT.equals(eAnnotation.getSource())) {
+ if (!eAnnotation.getReferences().isEmpty()) {
+ HyperLinkSpecificObject specificObjectHyperlink = new HyperLinkSpecificObject();
+ specificObjectHyperlink.setTargetElement(eAnnotation.getReferences().get(0));
+ specificObjectHyperlink.setIsDefault(Boolean.parseBoolean(eAnnotation.getDetails().get(HyperLinkConstants.HYPERLINK_IS_DEFAULT_NAVIGATION)));
+ specificObjectHyperlink.setTooltipText(eAnnotation.getDetails().get(HyperLinkConstants.HYPERLINK_TOOLTYPE_TEXT));
+ return specificObjectHyperlink;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public RecordingCommand getAddHyperLinkCommand(TransactionalEditingDomain domain, EModelElement object, HyperLinkObject hyperLinkObject) {
+ if (hyperLinkObject instanceof HyperLinkSpecificObject) {
+ HyperLinkSpecificObject hyperLinkSpecificObject = (HyperLinkSpecificObject) hyperLinkObject;
+ return new CreateHyperLinkObjectCommand(domain, object, hyperLinkSpecificObject.getTooltipText(), HyperLinkConstants.PAPYRUS_HYPERLINK_SPECIFIC_ELEMENT, hyperLinkSpecificObject.getTargetElement(), hyperLinkObject.getIsDefault());
+ }
+ return null;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/WebHyperLinkHelper.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/WebHyperLinkHelper.java
new file mode 100644
index 00000000000..e263b4dc5c1
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/helper/WebHyperLinkHelper.java
@@ -0,0 +1,100 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.helper;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.hyperlink.commands.CreateHyperLinkWebCommand;
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkWeb;
+import org.eclipse.papyrus.infra.hyperlink.ui.EditorHyperLinkWebShell;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+/**
+ * this is an helper to manager hyperlink web
+ *
+ * @author PT202707
+ *
+ */
+public class WebHyperLinkHelper extends AbstractHyperLinkHelper {
+
+
+ @Override
+ public HyperLinkObject getHyperLinkObject(EAnnotation eAnnotation) {
+ if (eAnnotation.getSource().equals(HyperLinkConstants.HYPERLINK_WEB)) {
+ HyperLinkWeb hyperLinkWeb = new HyperLinkWeb();
+ hyperLinkWeb.setHyperLinkWeb(eAnnotation.getDetails().get(HyperLinkConstants.HYPERLINK_WEB_LINK));
+ hyperLinkWeb.setTooltipText(eAnnotation.getDetails().get(HyperLinkConstants.HYPERLINK_TOOLTYPE_TEXT));
+ if (eAnnotation.getDetails().get(HyperLinkConstants.HYPERLINK_IS_DEFAULT_NAVIGATION) != null) {
+ boolean isDefaultNaviagation = Boolean.parseBoolean(eAnnotation.getDetails().get(HyperLinkConstants.HYPERLINK_IS_DEFAULT_NAVIGATION));
+ hyperLinkWeb.setIsDefault(isDefaultNaviagation);
+ }
+ else {
+ hyperLinkWeb.setIsDefault(false);
+ }
+
+ return hyperLinkWeb;
+ }
+
+ return null;
+ }
+
+ @Override
+ public RecordingCommand getAddHyperLinkCommand(TransactionalEditingDomain domain, EModelElement object, HyperLinkObject HyperLinkObject) {
+ if (HyperLinkObject instanceof HyperLinkWeb) {
+ HyperLinkWeb hyperLinkWeb = (HyperLinkWeb) HyperLinkObject;
+ return new CreateHyperLinkWebCommand(domain, object, hyperLinkWeb.getTooltipText(), hyperLinkWeb.getHyperLinkWeb(), HyperLinkObject.getIsDefault());
+ }
+ else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getNameofManagedHyperLink() {
+ return Messages.WebHyperLinkHelper_Web;
+ }
+
+ @Override
+ public void executeNewMousePressed(List<HyperLinkObject> list, EObject aModel) {
+ EditorHyperLinkWebShell editor = new EditorHyperLinkWebShell();
+ editor.open();
+ if (editor.getHyperLinkWeb() != null) {
+ list.add(editor.getHyperLinkWeb());
+ }
+
+ }
+
+ @Override
+ public ArrayList<HyperLinkObject> getFilteredObject(List<HyperLinkObject> HyperLinkObjects) {
+ ArrayList<HyperLinkObject> result = new ArrayList<HyperLinkObject>();
+ Iterator<HyperLinkObject> iterator = HyperLinkObjects.iterator();
+ while (iterator.hasNext()) {
+ HyperLinkObject HyperLinkObject = iterator.next();
+ if (HyperLinkObject instanceof HyperLinkWeb) {
+ result.add(HyperLinkObject);
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/messages/Messages.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/messages/Messages.java
new file mode 100644
index 00000000000..7ce443f8893
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/messages/Messages.java
@@ -0,0 +1,137 @@
+/*****************************************************************************
+ * Copyright (c) 2011, 2016 CEA LIST, Christian W. Damus, 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:
+ * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ * Christian W. Damus (CEA LIST) - Consolidate all hyperlink helper contributions into one tab
+ * Christian W. Damus - bug 485220
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+
+ private static final String BUNDLE_NAME = "org.eclipse.papyrus.infra.hyperlink.messages.messages"; //$NON-NLS-1$
+
+ public static String HyperLinkEditorHelpersRegistrationUtil_ICantCreateTheClassForAnHelper;
+
+ public static String HyperLinkEditorHelpersRegistrationUtil_NotAnInstanceOf;
+
+ public static String HyperLinkHelpersRegistrationUtil_ICantCreateTheClassForAnHelper;
+
+ public static String HyperLinkHelpersRegistrationUtil_TheHelperWillBeIgnored;
+
+ public static String HyperLinkTabRegistrationUtil_ICantCreateTheTab;
+
+ public static String HyperLinkTabRegistrationUtil_tabWillBeIgnored;
+
+ public static String HyperLinkTabRegistrationUtil_NotAnInstanceOf;
+
+ public static String AbstractEditHyperlinkDocumentShell_Cancel;
+
+ public static String AbstractEditHyperlinkDocumentShell_Diagram;
+
+ public static String AbstractEditHyperlinkDocumentShell_Document;
+
+ public static String AbstractEditHyperlinkDocumentShell_EditHyperlink;
+
+ public static String AbstractEditHyperlinkDocumentShell_EditionOfAHyperLink;
+
+ public static String AbstractEditHyperlinkDocumentShell_OK;
+
+ public static String AbstractEditHyperlinkDocumentShell_TooltipText;
+
+ public static String AbstractEditHyperlinkDocumentShell_ToolTipText;
+
+ public static String AbstractEditHyperlinkDocumentShell_UseDefault;
+
+ public static String AbstractEditHyperlinkShell_Cancel;
+
+ public static String AbstractEditHyperlinkShell_EditHyperLink;
+
+ public static String AbstractEditHyperlinkShell_EditionOfAHyperLink;
+
+ public static String AbstractEditHyperlinkShell_object;
+
+ public static String AbstractEditHyperlinkShell_OK;
+
+ public static String AbstractEditHyperlinkShell_ToolTipText;
+
+ public static String AbstractEditHyperlinkShell_ToolTipText_;
+
+ public static String AbstractEditHyperlinkShell_UseDefault;
+
+ public static String AbstractHyperLinkManagerShell_Cancel;
+
+ public static String AbstractHyperLinkManagerShell_HyperLink;
+
+ public static String AbstractHyperLinkManagerShell_OK;
+
+ public static String AbstractLookForEditorShell_Cancel;
+
+ public static String AbstractLookForEditorShell_EditorsList;
+
+ public static String AbstractLookForEditorShell_New;
+
+ public static String AbstractLookForEditorShell_OK;
+
+ public static String AbstractLookForEditorShell_Remove;
+
+ public static String AbstractLookForEditorShell_TreeView;
+
+ public static String DefaultHyperLinkTab_DefaultHyperlinks;
+
+ public static String DefaultHyperLinkTab_DefaultHyperLinks;
+
+ public static String DefaultHyperLinkTab_HyperLinks;
+
+ public static String DiagramNavigationDialog_ChooseHyperLinks;
+
+ public static String DiagramNavigationDialog_WhichHyperLinksWouldYouToNavigateTo;
+
+ public static String EditorHyperlinkDocumentShell_Open;
+
+ public static String EditorHyperLinkWebShell_Hyperlinks;
+
+ public static String HyperLinkManagerShell_HyperLinksCommands;
+ public static String HyperLinkManagerShell_ImpossibleToReadPreferences;
+
+ public static String HyperLinkManagerShell_InputOutputException;
+ public static String HyperLinkTab_addTooltip;
+
+ public static String HyperLinkTab_Hyperlink;
+
+ public static String HyperLinkTab_Hyperlinks;
+
+ public static String HyperLinkTab_hyperLinks;
+
+ public static String HyperLinkTab_title;
+
+ public static String HyperLinkTab_Listof;
+
+ public static String HyperLinkTab_SetOf;
+
+ public static String DocumentHyperLinkHelper_Document;
+
+ public static String HyperLinkHelperFactory_addHyperLinksCommand;
+
+ public static String HyperLinkHelperFactory_ImpossibleToFindACommandToSerialize;
+
+ public static String WebHyperLinkHelper_Web;
+ public static String HyperLinkDocument_ExternalFiles;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/messages/messages.properties b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/messages/messages.properties
new file mode 100644
index 00000000000..3b8138bee92
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/messages/messages.properties
@@ -0,0 +1,67 @@
+# Copyright (c) 2011, 2016 CEA LIST, Christian W. Damus, 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:
+# CEA LIST - Initial API and implementation
+# Christian W. Damus (CEA LIST) - Consolidate all hyperlink helper contributions into one tab
+# Christian W. Damus - bug 485220
+
+HyperLinkEditorHelpersRegistrationUtil_ICantCreateTheClassForAnHelper=I can't create the class for an helper
+HyperLinkEditorHelpersRegistrationUtil_NotAnInstanceOf={0} is not an instanceof {1}
+HyperLinkHelpersRegistrationUtil_ICantCreateTheClassForAnHelper=I can't create the class for an helper
+HyperLinkHelpersRegistrationUtil_TheHelperWillBeIgnored=The helper {0} will be ignored because I can't read its position
+HyperLinkTabRegistrationUtil_ICantCreateTheTab=I can't create the class for a tab
+HyperLinkTabRegistrationUtil_tabWillBeIgnored=The tab {0} will be ignored because I can't read its position
+HyperLinkTabRegistrationUtil_NotAnInstanceOf=The class {0} is not an instance of {1}.
+AbstractEditHyperlinkDocumentShell_Cancel=Cancel
+AbstractEditHyperlinkDocumentShell_Diagram=Diagram
+AbstractEditHyperlinkDocumentShell_Document=Document:
+AbstractEditHyperlinkDocumentShell_EditHyperlink=Edit Hyperlink
+AbstractEditHyperlinkDocumentShell_EditionOfAHyperLink=Edition of a hyperlink
+AbstractEditHyperlinkDocumentShell_OK=Ok
+AbstractEditHyperlinkDocumentShell_TooltipText=Tooltip text:
+AbstractEditHyperlinkDocumentShell_ToolTipText=Tooltip text
+AbstractEditHyperlinkDocumentShell_UseDefault=Use default Tooltip
+AbstractEditHyperlinkShell_Cancel=Cancel
+AbstractEditHyperlinkShell_EditHyperLink=Edit Hyperlink
+AbstractEditHyperlinkShell_EditionOfAHyperLink=Edition of a hyperlink
+AbstractEditHyperlinkShell_object=object
+AbstractEditHyperlinkShell_OK=Ok
+AbstractEditHyperlinkShell_ToolTipText=Tooltip text:
+AbstractEditHyperlinkShell_ToolTipText_=Tooltip text
+AbstractEditHyperlinkShell_UseDefault=Use Default Tooltip
+AbstractHyperLinkManagerShell_Cancel=Cancel
+AbstractHyperLinkManagerShell_HyperLink=HyperLink
+AbstractHyperLinkManagerShell_OK=Ok
+AbstractLookForEditorShell_Cancel=Cancel
+AbstractLookForEditorShell_EditorsList=Editors list
+AbstractLookForEditorShell_New=New
+AbstractLookForEditorShell_OK=OK
+AbstractLookForEditorShell_Remove=Remove
+AbstractLookForEditorShell_TreeView=Tree view
+DefaultHyperLinkTab_DefaultHyperlinks=Defaults HyperLinks
+DefaultHyperLinkTab_DefaultHyperLinks=Default Hyperlinks (by double-click):
+DefaultHyperLinkTab_HyperLinks=HyperLinks :
+DiagramNavigationDialog_ChooseHyperLinks=Choose hyperlink:
+DiagramNavigationDialog_WhichHyperLinksWouldYouToNavigateTo=Which hyperlinks would you like to navigate to?
+EditorHyperlinkDocumentShell_Open=Open
+EditorHyperLinkWebShell_Hyperlinks=Hyperlinks:
+HyperLinkManagerShell_HyperLinksCommands=HyperLinks Commands
+HyperLinkManagerShell_ImpossibleToReadPreferences=Impossible to read preferences
+HyperLinkManagerShell_InputOutputException=input/ouput exception
+HyperLinkTab_addTooltip=Create a {0} hyperlink
+HyperLinkTab_Hyperlink=\ hyperlinks:
+HyperLinkTab_hyperLinks=\ hyperlinks
+HyperLinkTab_Hyperlinks=hyperlinks
+HyperLinkTab_title=Hyperlinks
+HyperLinkTab_Listof=List of hyperlinks:
+HyperLinkTab_SetOf=List of hyperlinks
+DocumentHyperLinkHelper_Document=Document in local filesystem
+HyperLinkHelperFactory_addHyperLinksCommand=Add hyperlinks command
+HyperLinkHelperFactory_ImpossibleToFindACommandToSerialize=Impossible to find a command to serialize
+WebHyperLinkHelper_Web=Web
+HyperLinkDocument_ExternalFiles=External Files
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkDocument.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkDocument.java
new file mode 100644
index 00000000000..6b52450caee
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkDocument.java
@@ -0,0 +1,108 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.object;
+
+import java.net.URI;
+import java.util.List;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.filesystem.URIUtil;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.ui.EditorHyperlinkDocumentShell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * The Class HyperLinkDocument. A container of document
+ */
+public class HyperLinkDocument extends HyperLinkObject {
+
+ /**
+ * Gets the hyperlink document.
+ *
+ * @return the hyperlink document
+ */
+ public String getHyperlinkDocument() {
+ return (String) super.getObject();
+ }
+
+ /**
+ * Sets the hyperlink document.
+ *
+ * @param object
+ * the new hyperlink document as a string representing an absolute file path
+ */
+ public void setHyperlinkDocument(String object) {
+ try {
+ URI originalURI = URIUtil.toURI(object);
+ URI relativeURI = null;
+
+ if (originalURI != null && originalURI.isAbsolute()) {
+ relativeURI = org.eclipse.core.runtime.URIUtil.makeRelative(originalURI, getBaseURI());
+ } else {
+ relativeURI = new URI(object);
+ }
+
+ super.setObject(relativeURI.toString());
+ } catch (Exception e) {
+ Activator.log.error(e);
+ super.setObject("");
+ }
+ }
+
+ @Override
+ public void openLink() {
+ try {
+ // this is a file try to open it
+ String fileName = getHyperlinkDocument();
+
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ IWorkbenchPage page = window.getActivePage();
+
+ URI relativeURI = new URI(fileName);
+ URI absoluteURI = org.eclipse.core.runtime.URIUtil.makeAbsolute(relativeURI, getBaseURI());
+
+ IFileStore fileStore = EFS.getStore(absoluteURI);
+
+ IDE.openEditorOnFileStore(page, fileStore); // Let eclipse determine the better editor type for our file
+ } catch (Exception e) {
+ Activator.log.error(e);
+ }
+ }
+
+ @Override
+ public void executeEditMousePressed(List<HyperLinkObject> list, EObject amodel) {
+ EditorHyperlinkDocumentShell editor = new EditorHyperlinkDocumentShell();
+ editor.setHyperlinkDocument(this);
+ editor.open();
+ int index = list.indexOf(this);
+ list.remove(this);
+ list.add(index, editor.getHyperlinkDocument());
+
+ }
+
+ @Override
+ public boolean needsOpenCommand() {
+ return false;
+ }
+
+ private URI getBaseURI() {
+ return ResourcesPlugin.getWorkspace().getRoot().getLocationURI();
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkObject.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkObject.java
new file mode 100644
index 00000000000..2d96fb8daf0
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkObject.java
@@ -0,0 +1,114 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.object;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+
+
+/**
+ * This is the Object use to manipulate into hyperlinks
+ *
+ */
+public abstract class HyperLinkObject {
+
+ /**
+ * the associated tool tip
+ */
+ protected String tooltipText;
+
+ /** the object that is the target of the hyperlink **/
+ protected Object object;
+
+ /**
+ * boolean to known if this hyperlink is a default hyperlink
+ */
+ protected boolean isDefault = false;
+
+ /**
+ * @return the associated tooltip
+ */
+ public String getTooltipText() {
+ return tooltipText;
+ }
+
+ /**
+ * set a string that is the associated tool tup
+ *
+ * @param tooltipText
+ */
+ public void setTooltipText(String tooltipText) {
+ this.tooltipText = tooltipText;
+ }
+
+ /**
+ *
+ * @return the object that is the target of the hyperlink
+ */
+ public Object getObject() {
+ return object;
+ }
+
+ /**
+ * set the object that will be the target of the hyperlink
+ *
+ * @param object
+ * the targeted object
+ */
+ public void setObject(Object object) {
+ this.object = object;
+ }
+
+ /**
+ * set a boolean in order to make this hyperlink as default
+ *
+ * @param isDefault
+ * true or false
+ */
+ public void setIsDefault(boolean isDefault) {
+ this.isDefault = isDefault;
+ }
+
+ /**
+ *
+ * @return true is the hyperlink is default
+ */
+ public boolean getIsDefault() {
+ return this.isDefault;
+ }
+
+ /**
+ * Used to execute an action when the hyperlink object is selected and clicked to be edited
+ *
+ * @param list
+ * of hyperlink that are containted by a graphical element
+ * @param amodel
+ * the top package root element
+ */
+ public abstract void executeEditMousePressed(List<HyperLinkObject> list, EObject amodel);
+
+ /**
+ * Tells whether openLink() should be called within an EMF command
+ *
+ * @return
+ */
+ public abstract boolean needsOpenCommand();
+
+ /**
+ * Opens the current hyperlink.
+ */
+ public abstract void openLink();
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkSpecificObject.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkSpecificObject.java
new file mode 100644
index 00000000000..9728c59aed1
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkSpecificObject.java
@@ -0,0 +1,84 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST.
+ *
+ *
+ * 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:
+ * Camille Letavernier (camille.letavernier@cea.fr) - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.object;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.Activator;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.services.openelement.service.OpenElementService;
+
+/**
+ * References a specific object in a View (Diagram/Table/...)
+ *
+ * @author Camille
+ *
+ */
+public class HyperLinkSpecificObject extends HyperLinkObject {
+
+ private EObject targetElement;
+
+ public HyperLinkSpecificObject(EObject targetElement) {
+ this.targetElement = targetElement;
+ }
+
+ public HyperLinkSpecificObject() {
+ // Nothing
+ }
+
+ @Override
+ public void executeEditMousePressed(List<HyperLinkObject> list, EObject amodel) {
+ // TODO Auto-generated method stub
+ // Edit the hyperlink
+ }
+
+ public void setTargetElement(EObject targetElement) {
+ this.targetElement = targetElement;
+ }
+
+ @Override
+ public boolean needsOpenCommand() {
+ return false;
+ }
+
+ @Override
+ public void openLink() {
+ if (targetElement == null) {
+ return;
+ }
+
+ OpenElementService openElementService;
+ // IMultiDiagramEditor editor;
+ try {
+ openElementService = ServiceUtilsForEObject.getInstance().getService(OpenElementService.class, targetElement);
+ // editor = ServiceUtilsForEObject.getInstance().getService(IMultiDiagramEditor.class, targetElement);
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ return;
+ }
+
+ try {
+ openElementService.openElement(targetElement);
+ } catch (Exception ex) {
+ Activator.log.error(ex);
+ }
+ }
+
+ public EObject getTargetElement() {
+ return targetElement;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkWeb.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkWeb.java
new file mode 100644
index 00000000000..8bf354142df
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/object/HyperLinkWeb.java
@@ -0,0 +1,67 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.object;
+
+import java.net.URL;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.ui.EditorHyperLinkWebShell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+
+/**
+ * this is an hyperlink to manage web link (it open a web browser when it is selected)
+ *
+ */
+public class HyperLinkWeb extends HyperLinkObject {
+
+ public String getHyperLinkWeb() {
+ // TODO Auto-generated method stub
+ return (String) super.getObject();
+ }
+
+ public void setHyperLinkWeb(String object) {
+ // TODO Auto-generated method stub
+ super.setObject(object);
+ }
+
+ @Override
+ public void openLink() {
+ try {
+ // this is an url
+ PlatformUI.getWorkbench().getBrowserSupport().createBrowser(IWorkbenchBrowserSupport.AS_EXTERNAL, "aCustomId", "url", "url").openURL(new URL(this.getHyperLinkWeb())); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ } catch (Exception e) {
+ Activator.log.error(e);
+ }
+
+ }
+
+ @Override
+ public void executeEditMousePressed(List<HyperLinkObject> list, EObject amodel) {
+ EditorHyperLinkWebShell editor = new EditorHyperLinkWebShell();
+ editor.setHyperLinkWeb(this);
+ editor.open();
+ int index = list.indexOf(this);
+ list.remove(this);
+ list.add(index, editor.getHyperLinkWeb());
+
+ }
+
+ @Override
+ public boolean needsOpenCommand() {
+ return false;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/preferences/HyperlinkServicePreferencesPage.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/preferences/HyperlinkServicePreferencesPage.java
new file mode 100644
index 00000000000..3756482688b
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/preferences/HyperlinkServicePreferencesPage.java
@@ -0,0 +1,218 @@
+/*****************************************************************************
+ * Copyright (c) 2015 CEA LIST 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:
+ * Shuai Li (CEA LIST) <shuai.li@cea.fr> - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.hyperlink.preferences;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.jface.window.ToolTip;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.service.impl.HyperlinkServiceImpl;
+import org.eclipse.papyrus.infra.hyperlink.service.impl.HyperlinkServiceImpl.ContributorDescriptor;
+import org.eclipse.papyrus.infra.hyperlink.service.impl.HyperlinkServiceImpl.HyperlinkContributorDescriptor;
+import org.eclipse.papyrus.infra.widgets.providers.CollectionContentProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.osgi.service.prefs.BackingStoreException;
+
+public class HyperlinkServicePreferencesPage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ public static final int ACTIVATION_COLUMN = 0;
+
+ private Map<HyperlinkContributorDescriptor, Button> hyperlinkCheckboxes;
+
+ private HyperlinkServiceImpl hyperlinkService = new HyperlinkServiceImpl();
+
+ /**
+ *
+ * Constructor.
+ *
+ */
+ public HyperlinkServicePreferencesPage() {
+ super("Hyperlink Services", org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImageDescriptor("/icons/papyrus.png"));
+ }
+
+ public void init(IWorkbench workbench) {
+ setPreferenceStore(Activator.getDefault().getPreferenceStore());
+ setDescription("Papyrus hyperlink services configuration.\nSelect the strategies you wish to activate.");
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+
+ Composite self = new Composite(parent, SWT.NONE);
+ self.setLayout(new GridLayout(1, true));
+ self.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ final TableViewer tableViewer = new TableViewer(self, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ tableViewer.getTable().setLayoutData(gridData);
+
+ ColumnViewerToolTipSupport.enableFor(tableViewer, ToolTip.NO_RECREATE);
+
+ tableViewer.setContentProvider(CollectionContentProvider.instance);
+
+ try {
+ hyperlinkService.startService();
+ } catch (ServiceException ex) {
+ return self;
+ }
+
+ tableViewer.setLabelProvider(new ColumnLabelProvider() {
+
+ @Override
+ public void update(ViewerCell cell) {
+ if (cell.getColumnIndex() == 1) {
+ super.update(cell);
+ } else {
+ return;
+ }
+ }
+
+ @Override
+ public String getToolTipText(Object element) {
+ if (element instanceof ContributorDescriptor) {
+ return ((ContributorDescriptor) element).getDescription();
+ }
+ return super.getToolTipText(element);
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof ContributorDescriptor) {
+ return null;
+ }
+ return super.getImage(element);
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof ContributorDescriptor) {
+ return ((ContributorDescriptor) element).getLabel();
+ }
+ return super.getText(element);
+ }
+ });
+
+ TableLayout layout = new TableLayout();
+
+ new TableColumn(tableViewer.getTable(), SWT.LEFT);
+ layout.addColumnData(new ColumnWeightData(10, 25, false));
+
+ new TableColumn(tableViewer.getTable(), SWT.LEFT);
+ layout.addColumnData(new ColumnWeightData(100, 250, true));
+
+ tableViewer.getTable().setLayout(layout);
+ tableViewer.getTable().setHeaderVisible(false);
+
+ List<ContributorDescriptor> contributorDescriptors = new LinkedList<ContributorDescriptor>();
+ contributorDescriptors.addAll(hyperlinkService.getHyperlinkContributors());
+
+ tableViewer.setInput(contributorDescriptors);
+
+ hyperlinkCheckboxes = new HashMap<HyperlinkContributorDescriptor, Button>();
+
+ for (TableItem item : tableViewer.getTable().getItems()) {
+ if (item.getData() instanceof ContributorDescriptor) {
+ TableEditor editor = new TableEditor(tableViewer.getTable());
+
+ final Button button = new Button(tableViewer.getTable(), SWT.CHECK);
+ final TableItem currentItem = item;
+
+ final ContributorDescriptor strategy = (ContributorDescriptor) currentItem.getData();
+
+ if (strategy instanceof HyperlinkContributorDescriptor) {
+ hyperlinkCheckboxes.put((HyperlinkContributorDescriptor) strategy, button);
+ }
+
+ button.setSelection(strategy.isActive());
+
+ editor.setEditor(button, item, ACTIVATION_COLUMN);
+ editor.horizontalAlignment = SWT.CENTER;
+ editor.grabHorizontal = true;
+
+ }
+ }
+
+ return self;
+ }
+
+ @Override
+ protected void performDefaults() {
+ restoreDefaults();
+ super.performDefaults();
+ }
+
+ @Override
+ protected void performApply() {
+ IPreferenceStore preferences = Activator.getDefault().getPreferenceStore();
+
+ for (Map.Entry<HyperlinkContributorDescriptor, Button> entry : hyperlinkCheckboxes.entrySet()) {
+ boolean checked = entry.getValue().getSelection();
+ String isActiveKey = HyperlinkContributorDescriptor.getIsActiveKey(entry.getKey());
+ preferences.setValue(isActiveKey, checked);
+ }
+
+ try {
+ IEclipsePreferences preferenceStore = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
+ preferenceStore.flush();
+ } catch (BackingStoreException ex) {
+ Activator.log.error(ex);
+ }
+ }
+
+ @Override
+ public boolean performOk() {
+ performApply();
+ return super.performOk();
+ }
+
+ /**
+ * Restores the default preferences
+ */
+
+ public void restoreDefaults() {
+ IPreferenceStore preferences = Activator.getDefault().getPreferenceStore();
+
+ for (Map.Entry<HyperlinkContributorDescriptor, Button> entry : hyperlinkCheckboxes.entrySet()) {
+ String isActiveKey = HyperlinkContributorDescriptor.getIsActiveKey(entry.getKey());
+ boolean selected = preferences.getDefaultBoolean(isActiveKey);
+
+ entry.getValue().setSelection(selected);
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/HyperlinkContributor.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/HyperlinkContributor.java
new file mode 100644
index 00000000000..6d0c4f1def5
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/HyperlinkContributor.java
@@ -0,0 +1,29 @@
+/*****************************************************************************
+ * Copyright (c) 2015 CEA LIST 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:
+ * Shuai Li (CEA LIST) <shuai.li@cea.fr> - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.hyperlink.service;
+
+import java.util.List;
+
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+
+/**
+ * A HyperlinkContributor is used to create hyperlinks for
+ * a specific element
+ *
+ * @author Shuai Li
+ *
+ */
+public interface HyperlinkContributor {
+ public List<HyperLinkObject> getHyperlinks(Object fromElement);
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/HyperlinkService.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/HyperlinkService.java
new file mode 100644
index 00000000000..21f46613089
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/HyperlinkService.java
@@ -0,0 +1,24 @@
+/*****************************************************************************
+ * Copyright (c) 2015 CEA LIST 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:
+ * Shuai Li (CEA LIST) <shuai.li@cea.fr> - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.hyperlink.service;
+
+import org.eclipse.papyrus.infra.core.services.IService;
+
+/**
+ * @author Shuai Li
+ *
+ */
+public interface HyperlinkService extends IService, HyperlinkContributor {
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/impl/HyperlinkServiceImpl.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/impl/HyperlinkServiceImpl.java
new file mode 100644
index 00000000000..fe9944da69b
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/service/impl/HyperlinkServiceImpl.java
@@ -0,0 +1,193 @@
+/*****************************************************************************
+ * Copyright (c) 2015 CEA LIST 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:
+ * Shuai Li (CEA LIST) <shuai.li@cea.fr> - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.hyperlink.service.impl;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkSpecificObject;
+import org.eclipse.papyrus.infra.hyperlink.service.HyperlinkContributor;
+import org.eclipse.papyrus.infra.hyperlink.service.HyperlinkService;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+/**
+ * @author Shuai Li
+ *
+ */
+public class HyperlinkServiceImpl implements HyperlinkService {
+ public static final String IS_ACTIVE_KEY = "isActive";
+
+ protected ServicesRegistry registry;
+
+ private List<HyperlinkContributorDescriptor> hyperlinkContributors;
+
+ /**
+ * {@inheritDoc}
+ */
+ public void init(ServicesRegistry servicesRegistry) throws ServiceException {
+ // Nothing
+ this.registry = servicesRegistry;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void startService() throws ServiceException {
+ createHyperlinkContributors();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void disposeService() throws ServiceException {
+ this.registry = null;
+ }
+
+ protected void createHyperlinkContributors() {
+ hyperlinkContributors = new LinkedList<HyperlinkContributorDescriptor>();
+
+ IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(HyperLinkConstants.EXTENSION_ID);
+
+ for (IConfigurationElement e : config) {
+ if (!"contributor".equals(e.getName())) {
+ continue;
+ }
+ try {
+ Object instance = e.createExecutableExtension("contributor");
+ if (instance instanceof HyperlinkContributor) {
+ HyperlinkContributorDescriptor wrapper = new HyperlinkContributorDescriptor((HyperlinkContributor) instance);
+ wrapper.setId(e.getAttribute("id"));
+ wrapper.setLabel(e.getAttribute("label"));
+ wrapper.setDescription(e.getAttribute("description"));
+ wrapper.init();
+ hyperlinkContributors.add(wrapper);
+ }
+ } catch (Exception ex) {
+ Activator.log.warn("Invalid hyperlink contribution from: " + e.getContributor());
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public List<HyperLinkObject> getHyperlinks(Object fromElement) {
+ List<HyperLinkObject> hyperlinks = new LinkedList<HyperLinkObject>();
+ HashSet<Object> addedHyperlinks = new HashSet<Object>();
+
+ for (HyperlinkContributorDescriptor contributor : hyperlinkContributors) {
+ if (contributor.isActive()) {
+ List<HyperLinkObject> hyperlinkObjects = contributor.getHyperlinks(fromElement);
+
+ for (HyperLinkObject hyperlink : hyperlinkObjects) {
+ Object target = null;
+ if (hyperlink instanceof HyperLinkSpecificObject) {
+ target = ((HyperLinkSpecificObject) hyperlink).getTargetElement();
+ } else {
+ target = hyperlink.getObject();
+ }
+
+ if (!addedHyperlinks.contains(target)) {
+ addedHyperlinks.add(target);
+ hyperlinks.add(hyperlink);
+ }
+ }
+ }
+ }
+
+ return hyperlinks;
+ }
+
+ public static abstract class ContributorDescriptor {
+ private String label;
+
+ private String description;
+
+ private String id;
+
+ private final IPreferenceStore preferences;
+
+ public ContributorDescriptor() {
+ preferences = Activator.getDefault().getPreferenceStore();
+ }
+
+ public void init() {
+ String isActiveKey = getIsActiveKey(this);
+ preferences.setDefault(isActiveKey, true);
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public boolean isActive() { /* NavigationContributorWrapper strategy */
+ String preferenceKey = getIsActiveKey(this);
+ return preferences.getBoolean(preferenceKey);
+ }
+
+ public static String getIsActiveKey(ContributorDescriptor strategy) {
+ return strategy.getId() + "." + IS_ACTIVE_KEY;
+ }
+ }
+
+ public static class HyperlinkContributorDescriptor extends ContributorDescriptor implements HyperlinkContributor {
+ private final HyperlinkContributor contributor;
+
+ public HyperlinkContributorDescriptor(HyperlinkContributor contributor) {
+ super();
+ this.contributor = contributor;
+ }
+
+ public List<HyperLinkObject> getHyperlinks(Object fromElement) {
+ if (isActive()) {
+ return contributor.getHyperlinks(fromElement);
+ } else {
+ return Collections.emptyList();
+ }
+ }
+ }
+
+ public List<HyperlinkContributorDescriptor> getHyperlinkContributors() {
+ return hyperlinkContributors;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractEditHyperlinkDocumentShell.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractEditHyperlinkDocumentShell.java
new file mode 100644
index 00000000000..6d9d3bb3057
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractEditHyperlinkDocumentShell.java
@@ -0,0 +1,235 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+// TODO: Auto-generated Javadoc
+/**
+ * The Class AbstractEditHyperlinkDocumentShell. This Class has been generated
+ * from VisualEditor. Do not modify it manually by adding behavior! you will
+ * lose the capacity to open with VE. So this class is abstract and it contains
+ * set of getter in order to connect behavior in subclasses
+ */
+public class AbstractEditHyperlinkDocumentShell {
+
+ /** The Constant OBJECT_LABEL. */
+ // @unused
+ protected static final String OBJECT_LABEL = Messages.AbstractEditHyperlinkDocumentShell_Diagram;
+
+ /** The edit hyperlink shell. */
+ private Shell editHyperlinkShell = null; // @jve:decl-index=0:visual-constraint="44,36"
+
+ /** The Ok button. */
+ private Button OkButton = null;
+
+ /** The cancel button. */
+ private Button cancelButton = null;
+
+ /** The tooltip input text. */
+ private Text tooltipInputText = null;
+
+ /** The tooltip input label. */
+ private CLabel tooltipInputLabel = null;
+
+ /** The Object labeltext. */
+ private Text ObjectLabeltext = null;
+
+ /** The Objectc label. */
+ private CLabel ObjectcLabel = null;
+
+ /** The choose diagram button. */
+ private Button chooseDiagramButton = null;
+
+ /** The use defaultcheck box. */
+ private Button useDefaultcheckBox = null;
+
+ /**
+ * This method initializes editHyperlinkShell.
+ */
+ protected void createEditHyperlinkShell() {
+ GridData gridData51 = new GridData();
+ gridData51.horizontalAlignment = GridData.FILL;
+ gridData51.verticalAlignment = GridData.CENTER;
+ GridData gridData3 = new GridData();
+ gridData3.grabExcessHorizontalSpace = true;
+ gridData3.verticalAlignment = GridData.CENTER;
+ gridData3.horizontalAlignment = GridData.FILL;
+ GridData gridData2 = new GridData();
+ gridData2.grabExcessHorizontalSpace = true;
+ gridData2.verticalAlignment = GridData.CENTER;
+ gridData2.horizontalAlignment = GridData.FILL;
+ GridData gridData1 = new GridData();
+ gridData1.verticalAlignment = GridData.CENTER;
+ gridData1.grabExcessHorizontalSpace = true;
+ gridData1.grabExcessVerticalSpace = false;
+ gridData1.horizontalSpan = 5;
+ gridData1.horizontalAlignment = GridData.FILL;
+ GridData gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL;
+ gridData.verticalAlignment = GridData.CENTER;
+ gridData.horizontalSpan = 5;
+ gridData.grabExcessHorizontalSpace = true;
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 7;
+ gridLayout.makeColumnsEqualWidth = true;
+ // this line has to be commented in order to open with VISUAL EDITOR
+ editHyperlinkShell = new Shell(PlatformUI.getWorkbench().getDisplay().getActiveShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
+
+ // editHyperlinkShell = new Shell();
+ editHyperlinkShell.setText(Messages.AbstractEditHyperlinkDocumentShell_EditHyperlink);
+ editHyperlinkShell.setToolTipText(Messages.AbstractEditHyperlinkDocumentShell_EditionOfAHyperLink);
+ editHyperlinkShell.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ editHyperlinkShell.setLayout(gridLayout);
+ // editHyperlinkShell.setSize(new Point(625, 119));
+ ObjectcLabel = new CLabel(editHyperlinkShell, SWT.NONE);
+ ObjectcLabel.setText(Messages.AbstractEditHyperlinkDocumentShell_Document);
+ ObjectcLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ ObjectLabeltext = new Text(getEditHyperlinkShell(), SWT.BORDER);
+ ObjectLabeltext.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
+ ObjectLabeltext.setEditable(true);
+ ObjectLabeltext.setLayoutData(gridData1);
+ chooseDiagramButton = new Button(getEditHyperlinkShell(), SWT.NONE);
+ chooseDiagramButton.setImage(Activator.getDefault().getIcon(Activator.IMG_LOUPE));
+ chooseDiagramButton.setLayoutData(gridData51);
+ chooseDiagramButton.setText(""); //$NON-NLS-1$
+ tooltipInputLabel = new CLabel(editHyperlinkShell, SWT.NONE);
+ tooltipInputLabel.setText(Messages.AbstractEditHyperlinkDocumentShell_TooltipText);
+ tooltipInputLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ tooltipInputLabel.setToolTipText(Messages.AbstractEditHyperlinkDocumentShell_ToolTipText);
+ tooltipInputText = new Text(getEditHyperlinkShell(), SWT.BORDER);
+ tooltipInputText.setLayoutData(gridData);
+ useDefaultcheckBox = new Button(getEditHyperlinkShell(), SWT.CHECK);
+ useDefaultcheckBox.setText(Messages.AbstractEditHyperlinkDocumentShell_UseDefault);
+ useDefaultcheckBox.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ new Label(editHyperlinkShell, SWT.NONE);
+ new Label(getEditHyperlinkShell(), SWT.NONE);
+ new Label(editHyperlinkShell, SWT.NONE);
+ new Label(editHyperlinkShell, SWT.NONE);
+ new Label(getEditHyperlinkShell(), SWT.NONE);
+ OkButton = new Button(getEditHyperlinkShell(), SWT.NONE);
+ OkButton.setText(Messages.AbstractEditHyperlinkDocumentShell_OK);
+ OkButton.setLayoutData(gridData2);
+ cancelButton = new Button(getEditHyperlinkShell(), SWT.NONE);
+ cancelButton.setText(Messages.AbstractEditHyperlinkDocumentShell_Cancel);
+ cancelButton.setLayoutData(gridData3);
+
+ editHyperlinkShell.pack();
+ }
+
+ /**
+ * Gets the edit hyperlink shell.
+ *
+ * @return the editHyperlinkShell
+ */
+ protected Shell getEditHyperlinkShell() {
+ return editHyperlinkShell;
+ }
+
+ /**
+ * Gets the ok button.
+ *
+ * @return the okButton
+ */
+ protected Button getOkButton() {
+ return OkButton;
+ }
+
+ /**
+ * Gets the cancel button.
+ *
+ * @return the cancelButton
+ */
+ protected Button getCancelButton() {
+ return cancelButton;
+ }
+
+ /**
+ * Gets the tooltip input text.
+ *
+ * @return the tooltipInputText
+ */
+ protected Text getTooltipInputText() {
+ return tooltipInputText;
+ }
+
+ /**
+ * Gets the object labeltext.
+ *
+ * @return the objectLabeltext
+ */
+ protected Text getObjectLabeltext() {
+ return ObjectLabeltext;
+ }
+
+ /**
+ * Gets the choose diagram button.
+ *
+ * @return the chooseDiagramButton
+ */
+ protected Button getChooseDiagramButton() {
+ return chooseDiagramButton;
+ }
+
+ /**
+ * Gets the tooltip input label.
+ *
+ * @return the tooltipInputLabel
+ */
+ // @unused
+ protected CLabel getTooltipInputLabel() {
+ return tooltipInputLabel;
+ }
+
+ /**
+ * Gets the objectc label.
+ *
+ * @return the objectcLabel
+ */
+ protected CLabel getObjectcLabel() {
+ return ObjectcLabel;
+ }
+
+ /**
+ * Gets the use default check box.
+ *
+ * @return the useDefaultcheckBox
+ */
+ protected Button getUseDefaultCheckBox() {
+ return useDefaultcheckBox;
+ }
+
+ /**
+ * Sets the cancel button.
+ *
+ * @param cancelButton
+ * the cancelButton to set
+ */
+ // @unused
+ protected void setCancelButton(Button cancelButton) {
+ this.cancelButton = cancelButton;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractEditHyperlinkShell.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractEditHyperlinkShell.java
new file mode 100644
index 00000000000..bcfcc316c4a
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractEditHyperlinkShell.java
@@ -0,0 +1,189 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * The Class EditHyperlinkShell. This Class has been generated from
+ * VisualEditor. Do not modify it manually by adding behavior! you will lose the
+ * capacity to open with VE. So this class is abstract and it contains set of
+ * getter in order to connect behavior in subclasses
+ */
+public abstract class AbstractEditHyperlinkShell {
+
+ /** The Constant OBJECT_LABEL. */
+ protected static final String OBJECT_LABEL = Messages.AbstractEditHyperlinkShell_object;
+
+ /** The edit hyperlink shell. */
+ private Shell editHyperlinkShell = null; // @jve:decl-index=0:visual-constraint="12,45"
+
+ /** The Ok button. */
+ private Button OkButton = null;
+
+ /** The cancel button. */
+ private Button cancelButton = null;
+
+ /** The tooltip input text. */
+ private Text tooltipInputText = null;
+
+ /** The tooltip input label. */
+ private CLabel tooltipInputLabel = null;
+
+ /** The Object labeltext. */
+ private Text ObjectLabeltext = null;
+
+ /** The Objectc label. */
+ private CLabel ObjectcLabel = null;
+
+ private Button useDefaultCheckBox = null;
+
+ /**
+ * This method initializes editHyperlinkShell.
+ */
+ protected void createEditHyperlinkShell() {
+ GridData gridData3 = new GridData();
+ gridData3.grabExcessHorizontalSpace = true;
+ gridData3.verticalAlignment = GridData.CENTER;
+ gridData3.horizontalAlignment = GridData.FILL;
+ GridData gridData2 = new GridData();
+ gridData2.grabExcessHorizontalSpace = true;
+ gridData2.verticalAlignment = GridData.CENTER;
+ gridData2.horizontalAlignment = GridData.FILL;
+ GridData gridData1 = new GridData();
+ gridData1.horizontalSpan = 6;
+ gridData1.verticalAlignment = GridData.FILL;
+ gridData1.grabExcessHorizontalSpace = true;
+ gridData1.grabExcessVerticalSpace = false;
+ gridData1.horizontalAlignment = GridData.FILL;
+ GridData gridData = new GridData();
+ gridData.horizontalSpan = 5;
+ gridData.horizontalAlignment = GridData.FILL;
+ gridData.verticalAlignment = GridData.CENTER;
+ gridData.grabExcessHorizontalSpace = true;
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 7;
+ gridLayout.makeColumnsEqualWidth = true;
+
+ // this line has to be commented in order to open with VISUAL EDITOR
+ editHyperlinkShell = new Shell(PlatformUI.getWorkbench().getDisplay().getActiveShell(), SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL);
+
+ // editHyperlinkShell = new Shell(display, SWT.DIALOG_TRIM |
+ // SWT.APPLICATION_MODAL);
+
+ // editHyperlinkShell = new Shell();
+ editHyperlinkShell.setText(Messages.AbstractEditHyperlinkShell_EditHyperLink);
+ editHyperlinkShell.setToolTipText(Messages.AbstractEditHyperlinkShell_EditionOfAHyperLink);
+ editHyperlinkShell.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ editHyperlinkShell.setLayout(gridLayout);
+ // editHyperlinkShell.setSize(new Point(601, 119));
+ ObjectcLabel = new CLabel(editHyperlinkShell, SWT.NONE);
+ ObjectcLabel.setText(OBJECT_LABEL);
+ ObjectcLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ ObjectLabeltext = new Text(editHyperlinkShell, SWT.BORDER);
+ ObjectLabeltext.setLayoutData(gridData1);
+ tooltipInputLabel = new CLabel(editHyperlinkShell, SWT.NONE);
+ tooltipInputLabel.setText(Messages.AbstractEditHyperlinkShell_ToolTipText);
+ tooltipInputLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ tooltipInputLabel.setToolTipText(Messages.AbstractEditHyperlinkShell_ToolTipText_);
+ tooltipInputText = new Text(editHyperlinkShell, SWT.BORDER);
+ tooltipInputText.setLayoutData(gridData);
+ useDefaultCheckBox = new Button(getEditHyperlinkShell(), SWT.CHECK);
+ useDefaultCheckBox.setText(Messages.AbstractEditHyperlinkShell_UseDefault);
+ useDefaultCheckBox.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ new Label(editHyperlinkShell, SWT.NONE);
+ new Label(editHyperlinkShell, SWT.NONE);
+ new Label(editHyperlinkShell, SWT.NONE);
+ new Label(editHyperlinkShell, SWT.NONE);
+ new Label(getEditHyperlinkShell(), SWT.NONE);
+ OkButton = new Button(getEditHyperlinkShell(), SWT.NONE);
+ OkButton.setText(Messages.AbstractEditHyperlinkShell_OK);
+ OkButton.setLayoutData(gridData2);
+ cancelButton = new Button(getEditHyperlinkShell(), SWT.NONE);
+ cancelButton.setText(Messages.AbstractEditHyperlinkShell_Cancel);
+ cancelButton.setLayoutData(gridData3);
+
+ editHyperlinkShell.pack();
+ }
+
+ /**
+ * Gets the edit hyperlink shell.
+ *
+ * @return the editHyperlinkShell
+ */
+ public Shell getEditHyperlinkShell() {
+ return editHyperlinkShell;
+ }
+
+ /**
+ * Gets the ok button.
+ *
+ * @return the okButton
+ */
+ protected Button getOkButton() {
+ return OkButton;
+ }
+
+ /**
+ * Gets the cancel button.
+ *
+ * @return the cancelButton
+ */
+ protected Button getCancelButton() {
+ return cancelButton;
+ }
+
+ /**
+ * Gets the tooltip input text.
+ *
+ * @return the tooltipInputText
+ */
+ protected Text getTooltipInputText() {
+ return tooltipInputText;
+ }
+
+ /**
+ * Gets the object labeltext.
+ *
+ * @return the objectLabeltext
+ */
+ protected Text getObjectLabeltext() {
+ return ObjectLabeltext;
+ }
+
+ /**
+ * @return the objectcLabel
+ */
+ public CLabel getObjectcLabel() {
+ return ObjectcLabel;
+ }
+
+ /**
+ * @return the useDefaultCheckBox
+ */
+ protected Button getUseDefaultCheckBox() {
+ return useDefaultCheckBox;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractHyperLinkManagerShell.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractHyperLinkManagerShell.java
new file mode 100644
index 00000000000..5693a4be01b
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractHyperLinkManagerShell.java
@@ -0,0 +1,140 @@
+/*****************************************************************************
+ * Copyright (c) 2009-2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+import java.util.ArrayList;
+
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * The Class AbstractHyperLinkManagerShell. This Class has been generated from VisualEditor. Do not
+ * modify it manually by adding behavior! you will lose the capacity to open with VE. So this class
+ * is abstract and it contains set of getter in order to connect behavior in subclasses
+ */
+public abstract class AbstractHyperLinkManagerShell {
+
+ /** The hyper link shell. */
+ protected Shell hyperLinkShell = null;
+
+
+ public Shell getHyperLinkShell() {
+ return hyperLinkShell;
+ }
+
+ /** The c tab folder. */
+ private CTabFolder cTabFolder = null;
+
+
+ public CTabFolder getcTabFolder() {
+ return cTabFolder;
+ }
+
+
+
+ /** The Ok button. */
+ protected Button OkButton = null;
+
+ /** The cancel button. */
+ protected Button cancelButton = null;
+
+
+
+ protected ArrayList<AbstractHyperLinkTab> tabList = new ArrayList<AbstractHyperLinkTab>();
+
+ /**
+ * This method initializes cTabFolder.
+ */
+ private void createCTabFolder() {
+ GridData gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL;
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalSpan = 14;
+ gridData.verticalAlignment = GridData.FILL;
+ cTabFolder = new CTabFolder(hyperLinkShell, SWT.NONE);
+ cTabFolder.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ cTabFolder.setLayoutData(gridData);
+
+
+ }
+
+
+
+ /**
+ * This method initializes HyperlinkComposite.
+ */
+
+ /**
+ * This method initializes hyperLinkShell.
+ *
+ * @wbp.parser.entryPoint
+ */
+ protected void createHyperLinkShell() {
+ GridData gridData9 = new GridData();
+ gridData9.grabExcessHorizontalSpace = true;
+ gridData9.verticalAlignment = GridData.FILL;
+ gridData9.horizontalSpan = 2;
+ gridData9.horizontalAlignment = GridData.FILL;
+ GridData gridData8 = new GridData();
+ gridData8.horizontalAlignment = GridData.FILL;
+ gridData8.grabExcessHorizontalSpace = true;
+ gridData8.horizontalSpan = 2;
+ gridData8.verticalAlignment = GridData.FILL;
+ GridLayout gridLayout2 = new GridLayout();
+ gridLayout2.numColumns = 14;
+ gridLayout2.makeColumnsEqualWidth = true;
+
+ // this line has to be commented in order to open with VISUAL EDITOR
+ hyperLinkShell = new Shell(PlatformUI.getWorkbench().getDisplay().getActiveShell(), SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL);
+
+ // hyperLinkShell = new Shell();
+ hyperLinkShell.setText(Messages.AbstractHyperLinkManagerShell_HyperLink);
+ hyperLinkShell.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ createCTabFolder();
+ hyperLinkShell.setLayout(gridLayout2);
+ hyperLinkShell.setSize(new Point(687, 308));
+ OkButton = new Button(hyperLinkShell, SWT.NONE);
+ OkButton.setText(Messages.AbstractHyperLinkManagerShell_OK);
+ OkButton.setLayoutData(gridData9);
+ cancelButton = new Button(hyperLinkShell, SWT.NONE);
+ cancelButton.setText(Messages.AbstractHyperLinkManagerShell_Cancel);
+ cancelButton.setLayoutData(gridData8);
+
+ getHyperLinkShell().pack();
+ }
+
+ /**
+ * @return the okButton
+ */
+ public Button getOkButton() {
+ return OkButton;
+ }
+
+ /**
+ * @return the cancelButton
+ */
+ public Button getCancelButton() {
+ return cancelButton;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractHyperLinkTab.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractHyperLinkTab.java
new file mode 100644
index 00000000000..5ab795acd66
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractHyperLinkTab.java
@@ -0,0 +1,141 @@
+/*****************************************************************************
+ * Copyright (c) 2011, 2013 CEA LIST 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:
+ * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ * Christian W. Damus (CEA LIST) - Consolidate all hyperlink helper contributions into one tab
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.swt.custom.CTabFolder;
+
+/**
+ *
+ * Each new tab should extends this class
+ *
+ */
+public abstract class AbstractHyperLinkTab {
+
+ /**
+ * The id of the tab
+ */
+ private String tabId;
+
+ // TODO these parameters should be privated
+ /**
+ * The HyperLinkHelper for this tab
+ */
+ protected AbstractHyperLinkHelper hyperLinkHelper;
+
+ /**
+ * The hyperlink object
+ */
+ protected List<HyperLinkObject> hyperlinkObjects;
+
+ /**
+ * the CTabFolder
+ */
+ protected CTabFolder cTabFolder;
+
+ /**
+ * The edited element
+ */
+ protected EObject element;
+
+ /**
+ *
+ * Constructor.
+ *
+ * @param tabId
+ * the id of the tab
+ * @param helper
+ * the helper for this tab
+ */
+ public AbstractHyperLinkTab(final String tabId, final AbstractHyperLinkHelper helper) {
+ this.tabId = tabId;
+ this.hyperLinkHelper = helper;
+ }
+
+ /**
+ *
+ * Constructor.
+ *
+ */
+ public AbstractHyperLinkTab() {
+ // nothing to do
+ // used to create the tab from the extension point
+ }
+
+ /**
+ * Getter for {@link #tabId}
+ *
+ * @return
+ * this{@link #tabId}
+ */
+ public final String getTabId() {
+ return this.tabId;
+ }
+
+ /**
+ *
+ * @param hyperLinkObjectList
+ */
+ public abstract void setInput(final List<HyperLinkObject> hyperLinkObjectList);
+
+ /**
+ *
+ * @param tabId
+ * the id of the tab. This parameter can be set only one time!
+ */
+ public void setTabId(String tabId) {
+ if (this.tabId == null) {
+ this.tabId = tabId;
+ }
+ }
+
+ /**
+ * This method allows to init the parameter of the tab. These parameter can be set only one time!
+ *
+ * @param cTabFolder
+ * the CTabFolder for this tab
+ * @param hyperlinkObjects
+ * the hyperlink objects
+ * @param element
+ * the edited element
+ */
+ public void init(final CTabFolder cTabFolder, List<HyperLinkObject> hyperlinkObjects, final EObject element/* , final IHyperLinkShell shell */) {
+ if (this.cTabFolder == null) {
+ this.cTabFolder = cTabFolder;
+ }
+ if (this.hyperlinkObjects == null) {
+ this.hyperlinkObjects = hyperlinkObjects;
+ }
+ if (this.element == null) {
+ this.element = element;
+ }
+ }
+
+ /**
+ * Getter for {@link #hyperlinkObjects}
+ *
+ * @return
+ * this{@link #hyperlinkObjects}
+ */
+ public List<HyperLinkObject> getHyperlinkObjects() {
+ return this.hyperlinkObjects;
+ }
+
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractLookForEditorShell.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractLookForEditorShell.java
new file mode 100644
index 00000000000..3c6b413a37e
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/AbstractLookForEditorShell.java
@@ -0,0 +1,376 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+
+/**
+ * The Class AbstractLookForDiagramShell. This Class has been generated from
+ * VisualEditor. Do not modify it manually by adding behavior! you will lose the
+ * capacity to open with VE. So this class is abstract and it contains set of
+ * getter in order to connect behavior in subclasses
+ */
+public class AbstractLookForEditorShell {
+
+ /** The lookfor shell. */
+ private Shell lookforShell = null; // @jve:decl-index=0:visual-constraint="108,60"
+
+ /** The c tab folder. */
+ private CTabFolder cTabFolder = null;
+
+ /** The diagram listcomposite. */
+ private Composite diagramListcomposite = null;
+
+ /** The tree viewcomposite. */
+ private Composite treeViewcomposite = null;
+
+ private Composite afterTreeViewComposite = null;
+
+ /** The modeltree. */
+ private final Tree modeltree = null;
+
+ /** The new diagrambutton. */
+ private Button newDiagrambutton = null;
+
+ /** The remove diagrambutton. */
+ private Button removeDiagrambutton = null;
+
+ /** The O kbutton. */
+ private Button OKbutton = null;
+
+ /** The cancelbutton. */
+ private Button cancelbutton = null;
+
+ /** The diagram listtree. */
+ private final Tree diagramListtree = null;
+
+ /** The diagramfiltered tree. */
+ private FilteredTree diagramfilteredTree = null;
+
+ /** The mode filtered tree. */
+ private FilteredTree modeFilteredTree = null;
+
+ /** The c label. */
+ private CLabel cLabel = null;
+
+ /**
+ * This method initializes lookforShell.
+ */
+ protected void createLookforShell() {
+ GridData gridData2 = new GridData();
+ gridData2.horizontalAlignment = GridData.FILL;
+ gridData2.verticalAlignment = GridData.CENTER;
+ GridData gridData1 = new GridData();
+ gridData1.grabExcessHorizontalSpace = false;
+ gridData1.horizontalAlignment = GridData.FILL;
+ gridData1.verticalAlignment = GridData.CENTER;
+ gridData1.grabExcessVerticalSpace = false;
+ GridLayout gridLayout1 = new GridLayout();
+ gridLayout1.numColumns = 5;
+ gridLayout1.makeColumnsEqualWidth = true;
+ // this line has to be commented in order to open with VISUAL EDITOR
+ lookforShell = new Shell(PlatformUI.getWorkbench().getDisplay().getActiveShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
+
+ // lookforShell = new Shell();
+ lookforShell.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ createCTabFolder();
+ lookforShell.setLayout(gridLayout1);
+ lookforShell.setSize(new Point(501, 313));
+ new Label(lookforShell, SWT.NONE);
+ new Label(lookforShell, SWT.NONE);
+ new Label(lookforShell, SWT.NONE);
+ OKbutton = new Button(lookforShell, SWT.NONE);
+ OKbutton.setText(Messages.AbstractLookForEditorShell_OK);
+ OKbutton.setLayoutData(gridData1);
+ OKbutton.setEnabled(false);
+ cancelbutton = new Button(lookforShell, SWT.NONE);
+ cancelbutton.setText(Messages.AbstractLookForEditorShell_Cancel);
+ cancelbutton.setLayoutData(gridData2);
+ }
+
+ /**
+ * This method initializes cTabFolder.
+ */
+ protected void createCTabFolder() {
+ GridData gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL;
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalSpan = 5;
+ gridData.verticalAlignment = GridData.FILL;
+ cTabFolder = new CTabFolder(lookforShell, SWT.NONE);
+ cTabFolder.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ cTabFolder.setLayoutData(gridData);
+ createDiagramListcomposite();
+ createTreeViewcomposite();
+ CTabItem cTabItem = new CTabItem(cTabFolder, SWT.None);
+ cTabItem.setControl(diagramListcomposite);
+ cTabItem.setText(Messages.AbstractLookForEditorShell_EditorsList);// TODO change this name into Editor List
+ CTabItem cTabItem1 = new CTabItem(cTabFolder, SWT.None);
+ cTabItem1.setText(Messages.AbstractLookForEditorShell_TreeView);
+ cTabItem1.setControl(treeViewcomposite);
+ }
+
+ /**
+ * This method initializes diagramListcomposite.
+ */
+ private void createDiagramListcomposite() {
+ GridLayout gridLayout2 = new GridLayout();
+ diagramListcomposite = new Composite(cTabFolder, SWT.BORDER);
+ diagramListcomposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ createDiagramfilteredTree();
+ diagramListcomposite.setLayout(gridLayout2);
+ }
+
+ /**
+ * This method initializes treeViewcomposite.
+ */
+ private void createTreeViewcomposite() {
+ GridData gridData4 = new GridData();
+ gridData4.horizontalAlignment = GridData.FILL;
+ gridData4.verticalAlignment = GridData.CENTER;
+ GridData gridData5 = new GridData();
+ gridData4.horizontalAlignment = GridData.FILL;
+ gridData4.verticalAlignment = GridData.CENTER;
+
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ treeViewcomposite = new Composite(cTabFolder, SWT.NONE);
+ treeViewcomposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+
+ createModelFilteredTree();
+
+ treeViewcomposite.setLayout(gridLayout);
+ newDiagrambutton = new Button(treeViewcomposite, SWT.NONE);
+ newDiagrambutton.setText(Messages.AbstractLookForEditorShell_New);
+ newDiagrambutton.setLayoutData(gridData4);
+ removeDiagrambutton = new Button(treeViewcomposite, SWT.NONE);
+ removeDiagrambutton.setText(Messages.AbstractLookForEditorShell_Remove);
+ removeDiagrambutton.setLayoutData(gridData5);
+ cLabel = new CLabel(treeViewcomposite, SWT.NONE);
+ cLabel.setText(" "); //$NON-NLS-1$
+ cLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+
+ afterTreeViewComposite = new Composite(treeViewcomposite, SWT.NONE);
+ afterTreeViewComposite.setLayout(new FillLayout());
+ afterTreeViewComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ afterTreeViewComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ }
+
+ /**
+ * Recursively set the background of all children of parent composite to chosen color
+ * @param parent
+ * The composite that contains children
+ * @param color
+ * The background color
+ */
+ protected void setChildrenBackground(Composite parent, Color color) {
+ for (Control child : parent.getChildren()) {
+ child.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ if (child instanceof Composite) {
+ setChildrenBackground((Composite) child, color);
+ }
+ }
+ }
+
+ /**
+ * Gets the modeltree.
+ *
+ * @return the modeltree
+ */
+ // @unused
+ protected Tree getModeltree() {
+ return modeltree;
+ }
+
+ /**
+ * Gets the new diagrambutton.
+ *
+ * @return the newDiagrambutton
+ */
+ protected Button getNewDiagrambutton() {
+ return newDiagrambutton;
+ }
+
+ /**
+ * Sets the new diagrambutton.
+ *
+ * @param newDiagrambutton
+ * the newDiagrambutton to set
+ */
+ // @unused
+ protected void setNewDiagrambutton(Button newDiagrambutton) {
+ this.newDiagrambutton = newDiagrambutton;
+ }
+
+ /**
+ * Gets the remove diagrambutton.
+ *
+ * @return the removeDiagrambutton
+ */
+ protected Button getRemoveDiagrambutton() {
+ return removeDiagrambutton;
+ }
+
+ /**
+ * Sets the remove diagrambutton.
+ *
+ * @param removeDiagrambutton
+ * the removeDiagrambutton to set
+ */
+ // @unused
+ protected void setRemoveDiagrambutton(Button removeDiagrambutton) {
+ this.removeDiagrambutton = removeDiagrambutton;
+ }
+
+ /**
+ * Gets the o kbutton.
+ *
+ * @return the oKbutton
+ */
+ protected Button getOKbutton() {
+ return OKbutton;
+ }
+
+ /**
+ * Sets the o kbutton.
+ *
+ * @param oKbutton
+ * the oKbutton to set
+ */
+ // @unused
+ protected void setOKbutton(Button oKbutton) {
+ OKbutton = oKbutton;
+ }
+
+ /**
+ * Gets the cancelbutton.
+ *
+ * @return the cancelbutton
+ */
+ protected Button getCancelbutton() {
+ return cancelbutton;
+ }
+
+ /**
+ * Sets the cancelbutton.
+ *
+ * @param cancelbutton
+ * the cancelbutton to set
+ */
+ // @unused
+ protected void setCancelbutton(Button cancelbutton) {
+ this.cancelbutton = cancelbutton;
+ }
+
+ /**
+ * Gets the diagram listtree.
+ *
+ * @return the diagramListtree
+ */
+ // @unused
+ protected Tree getDiagramListtree() {
+ return diagramListtree;
+ }
+
+ /**
+ * Gets the lookfor shell.
+ *
+ * @return the lookforShell
+ */
+ protected Shell getLookforShell() {
+ return lookforShell;
+ }
+
+ /**
+ * Sets the lookfor shell.
+ *
+ * @param lookforShell
+ * the lookforShell to set
+ */
+ // @unused
+ protected void setLookforShell(Shell lookforShell) {
+ this.lookforShell = lookforShell;
+ }
+
+ /**
+ * This method initializes diagramfilteredTree.
+ */
+ private void createDiagramfilteredTree() {
+ GridData gridData6 = new GridData();
+ gridData6.horizontalAlignment = GridData.FILL;
+ gridData6.grabExcessHorizontalSpace = true;
+ gridData6.grabExcessVerticalSpace = true;
+ gridData6.verticalAlignment = GridData.FILL;
+ diagramfilteredTree = new FilteredTree(diagramListcomposite, SWT.BORDER, new PatternFilter(), true);
+ diagramfilteredTree.setLayoutData(gridData6);
+ }
+
+ /**
+ * This method initializes filteredTree.
+ */
+ private void createModelFilteredTree() {
+ GridData gridData3 = new GridData();
+ gridData3.horizontalAlignment = GridData.FILL;
+ gridData3.grabExcessHorizontalSpace = true;
+ gridData3.grabExcessVerticalSpace = true;
+ gridData3.verticalSpan = 3;
+ gridData3.verticalAlignment = GridData.FILL;
+ modeFilteredTree = new FilteredTree(treeViewcomposite, SWT.BORDER, new PatternFilter(), true);
+ modeFilteredTree.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ modeFilteredTree.setLayoutData(gridData3);
+ }
+
+ /**
+ * Gets the diagramfiltered tree.
+ *
+ * @return the diagramfilteredTree
+ */
+ protected FilteredTree getDiagramfilteredTree() {
+ return diagramfilteredTree;
+ }
+
+ /**
+ * Gets the mode filtered tree.
+ *
+ * @return the modeFilteredTree
+ */
+ protected FilteredTree getModeFilteredTree() {
+ return modeFilteredTree;
+ }
+
+ protected Composite getAfterTreeViewComposite() {
+ return afterTreeViewComposite;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/DefaultHyperLinkTab.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/DefaultHyperLinkTab.java
new file mode 100644
index 00000000000..c1d246d9279
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/DefaultHyperLinkTab.java
@@ -0,0 +1,349 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper;
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.papyrus.infra.widgets.providers.CollectionContentProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+
+/**
+ * this is the tab in charge to display the hyperlink for the property defaut
+ *
+ */
+public class DefaultHyperLinkTab extends AbstractHyperLinkTab {
+
+
+ /**
+ *
+ * Constructor.
+ *
+ */
+ public DefaultHyperLinkTab() {
+ super();
+ }
+
+ /**
+ *
+ * Constructor.
+ *
+ * @param tabId
+ * @param helper
+ */
+ public DefaultHyperLinkTab(final String tabId, final AbstractHyperLinkHelper helper) {
+ super(tabId, helper);
+ }
+
+ protected TableViewer availableHyperLinkViewer;
+
+ protected Button defaultHRight;
+
+ protected Button defaultHleft;
+
+ protected Button defaultHup;
+
+ protected Button defaultHdown;
+
+ protected TableViewer defaultHyperLinkViewer;
+
+ protected List<HyperLinkObject> defaultHyperLinkObject = new ArrayList<HyperLinkObject>();
+
+ protected List<HyperLinkObject> availableHyperLinkObject = new ArrayList<HyperLinkObject>();
+
+ protected Composite defaultHyperlinkComposite;
+
+
+ /**
+ *
+ * @return get the list of hyperlink that are to be as default hyperlinks
+ */
+ public List<HyperLinkObject> getDefaultHyperLinkObject() {
+ return defaultHyperLinkObject;
+ }
+
+ /**
+ *
+ * @see org.eclipse.papyrus.infra.hyperlink.ui.AbstractHyperLinkTab#init(org.eclipse.swt.custom.CTabFolder, java.util.List, org.eclipse.emf.ecore.EObject)
+ *
+ * @param cTabFolder
+ * @param hyperlinkObjects
+ * @param element
+ */
+ @Override
+ public void init(final CTabFolder cTabFolder, List<HyperLinkObject> hyperlinkObjects, EObject element) {
+ super.init(cTabFolder, hyperlinkObjects, element);
+ CTabItem tbtmDefaultsHyperlinks = new CTabItem(cTabFolder, SWT.NONE);
+ tbtmDefaultsHyperlinks.setText(Messages.DefaultHyperLinkTab_DefaultHyperlinks);
+ defaultHyperlinkComposite = new Composite(cTabFolder, SWT.NONE);
+ defaultHyperlinkComposite.setBackgroundMode(SWT.INHERIT_DEFAULT);
+ defaultHyperlinkComposite.setBackground(defaultHyperlinkComposite.getDisplay().getSystemColor(SWT.COLOR_WHITE));
+
+ defaultHyperlinkComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ defaultHyperlinkComposite.setLayout(new GridLayout(4, false));
+
+ Composite availableHyperlinks = new Composite(defaultHyperlinkComposite, SWT.NONE);
+ availableHyperlinks.setLayout(new GridLayout(1, true));
+ availableHyperlinks.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ Composite addRemoveButtonsComposite = new Composite(defaultHyperlinkComposite, SWT.NONE);
+ addRemoveButtonsComposite.setLayout(new GridLayout(1, true));
+ addRemoveButtonsComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER));
+
+ Composite defaultHyperlinks = new Composite(defaultHyperlinkComposite, SWT.NONE);
+ defaultHyperlinks.setLayout(new GridLayout(1, true));
+ defaultHyperlinks.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ Composite upDownButtonsComposite = new Composite(defaultHyperlinkComposite, SWT.NONE);
+ upDownButtonsComposite.setLayout(new GridLayout(1, true));
+ upDownButtonsComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER));
+
+ tbtmDefaultsHyperlinks.setControl(defaultHyperlinkComposite);
+
+ Label lblHyperlinks = new Label(availableHyperlinks, SWT.NONE);
+ lblHyperlinks.setText(Messages.DefaultHyperLinkTab_HyperLinks);
+
+ Label lblDefaultHyperlinksby = new Label(defaultHyperlinks, SWT.NONE);
+ lblDefaultHyperlinksby.setText(Messages.DefaultHyperLinkTab_DefaultHyperLinks);
+
+ Table availableHyperLink = new Table(availableHyperlinks, SWT.BORDER | SWT.FULL_SELECTION);
+ availableHyperLink.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+
+ defaultHRight = new Button(addRemoveButtonsComposite, SWT.NONE);
+ defaultHRight.addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+
+ }
+
+ public void mouseDown(MouseEvent e) {
+ // move element left to right
+ if (availableHyperLinkViewer.getSelection() != null) {
+ // normally this viewer contains only hyperlinkObject
+ if (availableHyperLinkViewer.getSelection() instanceof IStructuredSelection) {
+ HyperLinkObject hyperlinkObjectToMove = (HyperLinkObject) ((IStructuredSelection) availableHyperLinkViewer.getSelection()).getFirstElement();
+ hyperlinkObjectToMove.setIsDefault(true);
+ availableHyperLinkObject.remove(hyperlinkObjectToMove);
+ defaultHyperLinkObject.add(hyperlinkObjectToMove);
+ refresh();
+ }
+ }
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+
+ }
+ });
+ defaultHRight.setToolTipText("Set default hyperlink");
+
+ defaultHleft = new Button(addRemoveButtonsComposite, SWT.NONE);
+ defaultHleft.addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+
+ }
+
+ public void mouseDown(MouseEvent e) {
+ // move element right to left
+ if (defaultHyperLinkViewer.getSelection() != null) {
+ // normally this viewer contains only hyperlinkObject
+ if (defaultHyperLinkViewer.getSelection() instanceof IStructuredSelection) {
+
+ HyperLinkObject hyperlinkObjectToMove = (HyperLinkObject) ((IStructuredSelection) defaultHyperLinkViewer.getSelection()).getFirstElement();
+ hyperlinkObjectToMove.setIsDefault(false);
+ defaultHyperLinkObject.remove(hyperlinkObjectToMove);
+ availableHyperLinkObject.add(hyperlinkObjectToMove);
+ refresh();
+ }
+ }
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+
+ }
+ });
+ defaultHleft.setToolTipText("Remove default hyperlink");
+
+
+ Table defaultHyperLink = new Table(defaultHyperlinks, SWT.BORDER | SWT.FULL_SELECTION);
+ defaultHyperLink.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+
+ defaultHup = new Button(upDownButtonsComposite, SWT.NONE);
+ defaultHup.setToolTipText("Move default hyperlink up");
+
+ defaultHup.addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+
+ }
+
+ public void mouseDown(MouseEvent e) {
+ // move element bottom to top
+ if (defaultHyperLinkViewer.getSelection() != null) {
+ // normally this viewer contains only hyperlinkObject
+ if (defaultHyperLinkViewer.getSelection() instanceof IStructuredSelection) {
+
+ HyperLinkObject hyperlinkObjectToMove = (HyperLinkObject) ((IStructuredSelection) defaultHyperLinkViewer.getSelection()).getFirstElement();
+ int index = defaultHyperLinkObject.indexOf(hyperlinkObjectToMove);
+ if (index > 0) {
+ defaultHyperLinkObject.remove(hyperlinkObjectToMove);
+ defaultHyperLinkObject.add(index - 1, hyperlinkObjectToMove);
+ refresh();
+ }
+ }
+ }
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+
+ }
+ });
+
+ defaultHdown = new Button(upDownButtonsComposite, SWT.NONE);
+ defaultHdown.setToolTipText("Move default hyperlink down");
+
+ defaultHdown.addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+
+ }
+
+ public void mouseDown(MouseEvent e) {
+ // move element top to bottom
+ if (defaultHyperLinkViewer.getSelection() != null) {
+ // normally this viewer contains only hyperlinkObject
+ if (defaultHyperLinkViewer.getSelection() instanceof IStructuredSelection) {
+
+ HyperLinkObject hyperlinkObjectToMove = (HyperLinkObject) ((IStructuredSelection) defaultHyperLinkViewer.getSelection()).getFirstElement();
+ int index = defaultHyperLinkObject.indexOf(hyperlinkObjectToMove);
+ if (index < defaultHyperLinkObject.size() - 1) {
+
+ defaultHyperLinkObject.remove(hyperlinkObjectToMove);
+ defaultHyperLinkObject.add(index + 1, hyperlinkObjectToMove);
+ refresh();
+ }
+ }
+ }
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+
+ }
+ });
+
+
+ // associate image to buttons
+ defaultHdown.setImage(Activator.getDefault().getIcon(Activator.IMG_ARROW_DOWN));
+ defaultHup.setImage(Activator.getDefault().getIcon(Activator.IMG_ARROW_UP));
+ defaultHleft.setImage(Activator.getDefault().getIcon(Activator.IMG_ARROW_LEFT));
+ defaultHRight.setImage(Activator.getDefault().getIcon(Activator.IMG_ARROW_RIGHT));
+
+ EObject contextElement = EMFHelper.getEObject(element);
+
+ ILabelProvider provider = null;
+ if (contextElement != null) {
+ try {
+ provider = ServiceUtilsForEObject.getInstance().getService(LabelProviderService.class, contextElement).getLabelProvider();
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ }
+ }
+
+ if (provider == null) {
+ provider = new LabelProvider();
+ }
+
+
+ // init tableviewer
+ availableHyperLinkViewer = new TableViewer(availableHyperLink);
+ availableHyperLinkViewer.setLabelProvider(provider);
+ availableHyperLinkViewer.setContentProvider(CollectionContentProvider.instance);
+
+ availableHyperLinkViewer.setInput(hyperlinkObjects);
+
+ defaultHyperLinkViewer = new TableViewer(defaultHyperLink);
+ defaultHyperLinkViewer.setLabelProvider(provider);
+ defaultHyperLinkViewer.setContentProvider(CollectionContentProvider.instance);
+ }
+
+ /**
+ *
+ * @return the composite that manage all widgets in the this tab
+ */
+ protected Composite getMainComposite() {
+ return defaultHyperlinkComposite;
+ }
+
+ /**
+ * used to refresh table
+ */
+ protected void refresh() {
+ availableHyperLinkViewer.setInput(availableHyperLinkObject);
+ defaultHyperLinkViewer.setInput(defaultHyperLinkObject);
+ }
+
+
+
+ /**
+ * input of this tab
+ * --> fill all available hyperlinks
+ * --> fill all default hyperlinks
+ *
+ * @param hyperLinkObjectList
+ * the list of hyperlinks
+ */
+ @Override
+ public void setInput(List<HyperLinkObject> hyperLinkObjectList) {
+ defaultHyperLinkObject.clear();
+ availableHyperLinkObject.clear();
+ // filter between default and not default
+ Iterator<HyperLinkObject> iterator = hyperLinkObjectList.iterator();
+ while (iterator.hasNext()) {
+ HyperLinkObject hyperlinkObject = iterator.next();
+ if (hyperlinkObject.getIsDefault()) {
+ defaultHyperLinkObject.add(hyperlinkObject);
+ } else {
+ availableHyperLinkObject.add(hyperlinkObject);
+ }
+
+ }
+ refresh();
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorHyperLinkWebShell.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorHyperLinkWebShell.java
new file mode 100644
index 00000000000..6376778beb7
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorHyperLinkWebShell.java
@@ -0,0 +1,172 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkWeb;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * The Class HyperlinkWebEditor is used to add or modify an hyperlink web entry.
+ * you can use the default button for the tooltip.
+ */
+public class EditorHyperLinkWebShell extends AbstractEditHyperlinkShell {
+
+ /** The Constant HYPERLINKS_LABEL. */
+ protected static final String HYPERLINKS_LABEL = Messages.EditorHyperLinkWebShell_Hyperlinks;
+
+ /** The Constant HTTP. */
+ protected static final String HTTP = "http://"; //$NON-NLS-1$
+
+ /** The hyper link web. */
+ private HyperLinkWeb hyperLinkWeb = null;
+
+ /** The usedefault tooltip. */
+ private boolean usedefaultTooltip = true;
+
+ /**
+ * Open.
+ */
+ public void open() {
+ Display display = Display.getCurrent();
+
+ // code use to wait for an action from the user
+ getEditHyperlinkShell().pack();
+ // getEditHyperlinkShell().setBounds(500, 500, 600, 120);
+ getEditHyperlinkShell().open();
+ while (!getEditHyperlinkShell().isDisposed()) {
+ if (!display.readAndDispatch()) {
+ display.sleep();
+ }
+ }
+ }
+
+ /**
+ * Instantiates a new hyperlink web editor.
+ */
+ public EditorHyperLinkWebShell() {
+ super();
+ createEditHyperlinkShell();
+
+ this.getObjectcLabel().setText(HYPERLINKS_LABEL);
+ // fill information
+ if (hyperLinkWeb != null) {
+ this.getObjectLabeltext().setText(hyperLinkWeb.getHyperLinkWeb());
+ this.getTooltipInputText().setText(hyperLinkWeb.getTooltipText());
+ } else {
+ this.getObjectLabeltext().setText(HTTP);
+ this.getObjectLabeltext().setSelection(HTTP.length());
+ }
+ // listener to cancel
+ this.getCancelButton().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ hyperLinkWeb = null;
+ getEditHyperlinkShell().close();
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+ // listener to click on OK
+ this.getOkButton().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ if (hyperLinkWeb == null) {
+ hyperLinkWeb = new HyperLinkWeb();
+ }
+ hyperLinkWeb.setHyperLinkWeb(getObjectLabeltext().getText().trim());
+ hyperLinkWeb.setTooltipText(getTooltipInputText().getText().trim());
+
+ getEditHyperlinkShell().close();
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+ // intialize "use default" check box
+ getUseDefaultCheckBox().setSelection(usedefaultTooltip);
+ if (usedefaultTooltip) {
+ getTooltipInputText().setEditable(false);
+ getTooltipInputText().setText(getObjectLabeltext().getText());
+ }
+ // add listener "use default button"
+ getUseDefaultCheckBox().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ usedefaultTooltip = getUseDefaultCheckBox().getSelection();
+ if (usedefaultTooltip) {
+ getTooltipInputText().setEditable(false);
+ getTooltipInputText().setText(getObjectLabeltext().getText());
+ } else {
+ getTooltipInputText().setEditable(true);
+ }
+ }
+
+ public void mouseDown(MouseEvent e) {
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+
+ // add a key listener on inputText to synchronize with the tooltip in
+ // the case of use
+ // default
+ getObjectLabeltext().addKeyListener(new KeyListener() {
+
+ public void keyReleased(KeyEvent e) {
+ if (usedefaultTooltip) {
+ getTooltipInputText().setText(getObjectLabeltext().getText());
+ }
+ }
+
+ public void keyPressed(KeyEvent e) {
+ }
+ });
+ }
+
+ /**
+ * Gets the hyper link web.
+ *
+ * @return the hyperLinkWeb
+ */
+ public HyperLinkWeb getHyperLinkWeb() {
+ return hyperLinkWeb;
+ }
+
+ /**
+ * Sets the hyper link web.
+ *
+ * @param hyperLinkWeb
+ * the hyperLinkWeb to set
+ */
+ public void setHyperLinkWeb(HyperLinkWeb hyperLinkWeb) {
+ this.hyperLinkWeb = hyperLinkWeb;
+ this.getObjectLabeltext().setText(hyperLinkWeb.getHyperLinkWeb());
+ this.getTooltipInputText().setText(hyperLinkWeb.getTooltipText());
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorHyperlinkDocumentShell.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorHyperlinkDocumentShell.java
new file mode 100644
index 00000000000..2fc7da1a338
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorHyperlinkDocumentShell.java
@@ -0,0 +1,164 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkDocument;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+
+/**
+ * The Class EditorHyperlinkDocumentShell.
+ */
+public class EditorHyperlinkDocumentShell extends AbstractEditHyperlinkDocumentShell {
+
+ /** The usedefault tooltip. */
+ protected boolean usedefaultTooltip = true;
+
+ /** The hyperlink document. */
+ protected HyperLinkDocument hyperlinkDocument;
+
+ /**
+ * Gets the hyperlink document.
+ *
+ * @return the hyperlinkDocument
+ */
+ public HyperLinkDocument getHyperlinkDocument() {
+ return hyperlinkDocument;
+ }
+
+ /**
+ * Sets the hyperlink document.
+ *
+ * @param hyperlinkDocument
+ * the hyperlinkDocument to set
+ */
+ public void setHyperlinkDocument(HyperLinkDocument hyperlinkDocument) {
+ this.hyperlinkDocument = hyperlinkDocument;
+ getObjectLabeltext().setText(getHyperlinkDocument().getHyperlinkDocument());
+ getTooltipInputText().setText(getHyperlinkDocument().getTooltipText());
+ }
+
+ /**
+ * Open.
+ */
+ public void open() {
+ Display display = Display.getCurrent();
+
+ // code use to wait for an action from the user
+ // getEditHyperlinkShell().setBounds(500, 500, 600, 120);
+ getEditHyperlinkShell().pack();
+ getEditHyperlinkShell().open();
+ while (!getEditHyperlinkShell().isDisposed()) {
+ if (!display.readAndDispatch()) {
+ display.sleep();
+ }
+ }
+ }
+
+ /**
+ * Instantiates a new editor hyperlink document shell.
+ */
+ public EditorHyperlinkDocumentShell() {
+ super();
+ createEditHyperlinkShell();
+
+ // intialize "use default" check box
+ getUseDefaultCheckBox().setSelection(usedefaultTooltip);
+ getObjectLabeltext().setEditable(false);
+ if (usedefaultTooltip) {
+ getTooltipInputText().setEditable(false);
+ getTooltipInputText().setText(getObjectLabeltext().getText());
+ }
+ // add listener "use default button"
+ getUseDefaultCheckBox().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ usedefaultTooltip = getUseDefaultCheckBox().getSelection();
+ if (usedefaultTooltip) {
+ getTooltipInputText().setEditable(false);
+ getTooltipInputText().setText(getObjectLabeltext().getText());
+ } else {
+ getTooltipInputText().setEditable(true);
+ }
+ }
+
+ public void mouseDown(MouseEvent e) {
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+
+ getChooseDiagramButton().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ FileDialog fd = new FileDialog(getEditHyperlinkShell(), SWT.OPEN);
+ fd.setText(Messages.EditorHyperlinkDocumentShell_Open);
+ String[] filterExt = { "*.pdf", "*.doc", "*.txt", "*" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ fd.setFilterExtensions(filterExt);
+ String selected = fd.open();
+ if (selected != null) {
+ getObjectLabeltext().setText(selected);
+ if (usedefaultTooltip) {
+ getTooltipInputText().setText(selected);
+ }
+ }
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+
+ // listener to cancel
+ this.getCancelButton().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ hyperlinkDocument = null;
+ getEditHyperlinkShell().close();
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+ // listener to click on OK
+ this.getOkButton().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ if (hyperlinkDocument == null) {
+ hyperlinkDocument = new HyperLinkDocument();
+ }
+ hyperlinkDocument.setHyperlinkDocument(getObjectLabeltext().getText().trim());
+ hyperlinkDocument.setTooltipText(getTooltipInputText().getText().trim());
+
+ getEditHyperlinkShell().close();
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorNavigationDialog.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorNavigationDialog.java
new file mode 100644
index 00000000000..ebc676d50f8
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/EditorNavigationDialog.java
@@ -0,0 +1,155 @@
+/*****************************************************************************
+ * Copyright (c) 2010 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ */
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.papyrus.infra.widgets.providers.CollectionContentProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * dialog to display a list of hyperlinks. the button ok is use to excute the
+ * action linked to the hyperlink (open new diagram, open new editor...)
+ *
+ */
+public class EditorNavigationDialog extends Dialog {
+
+ // prefered dimension
+ protected int width = 350;
+
+ protected int height = 150;
+
+ protected List<HyperLinkObject> hyperlinkObjects;
+
+ private TableViewer tableViewer;
+
+ protected Table availableHyperLink;
+
+ protected List<HyperLinkObject> hyperlinkResult = new ArrayList<HyperLinkObject>();
+
+ protected EObject contextElement;
+
+ /**
+ *
+ * dialog to display a list of hyperlinks. the button ok is use to excute
+ * the action linked to the hyperlink (open new diagram, open new editor...)
+ *
+ * @param parentShell
+ * a shell
+ * @param hyperlinkObjects
+ * the list of hyperlinkObjects
+ */
+ public EditorNavigationDialog(Shell parentShell, ArrayList<HyperLinkObject> hyperlinkObjects, EObject contextElement) {
+ super(parentShell);
+ this.hyperlinkObjects = hyperlinkObjects;
+ this.contextElement = contextElement;
+ }
+
+ @Override
+ protected boolean isResizable() {
+ return true;
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ super.createContents(parent);
+ Composite defaultHyperlinkComposite = (Composite) getDialogArea();
+
+ Label lblHyperlinks = new Label(defaultHyperlinkComposite, SWT.NONE);
+ lblHyperlinks.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
+ lblHyperlinks.setText(Messages.DiagramNavigationDialog_WhichHyperLinksWouldYouToNavigateTo);
+
+ // creation of the table
+ availableHyperLink = new Table(defaultHyperlinkComposite, SWT.CHECK | SWT.BORDER | SWT.FULL_SELECTION);
+ availableHyperLink.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ // set the content provider
+ tableViewer = new TableViewer(availableHyperLink);
+ tableViewer.setContentProvider(CollectionContentProvider.instance);
+
+ // set the label provider
+ ILabelProvider provider = null;
+ if (contextElement != null) {
+ try {
+ provider = ServiceUtilsForEObject.getInstance().getService(LabelProviderService.class, contextElement).getLabelProvider();
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ }
+ }
+
+ if (provider == null) {
+ provider = new LabelProvider();
+ }
+
+ tableViewer.setLabelProvider(provider);
+ tableViewer.setInput(this.hyperlinkObjects);
+
+ // Check all elements by default
+ for (TableItem item : availableHyperLink.getItems()) {
+ item.setChecked(true);
+ }
+
+ getShell().setText(Messages.DiagramNavigationDialog_ChooseHyperLinks);
+ getShell().pack();
+
+ return defaultHyperlinkComposite;
+ }
+
+ /**
+ * get the list of selected hyperlinks
+ *
+ * @return the list
+ */
+ public List<HyperLinkObject> getSelectedHyperlinks() {
+ return hyperlinkResult;
+ }
+
+ /**
+ *
+ * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+ *
+ */
+ @Override
+ protected void okPressed() {
+
+ hyperlinkResult = new ArrayList<HyperLinkObject>();
+ TableItem[] tableItems = availableHyperLink.getItems();
+ for (int i = 0; i < tableItems.length; i++) {
+ if (tableItems[i].getChecked()) {
+ hyperlinkResult.add((HyperLinkObject) tableItems[i].getData());
+ }
+ }
+
+ super.okPressed();
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/HyperLinkManagerShell.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/HyperLinkManagerShell.java
new file mode 100644
index 00000000000..8570d849a8d
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/HyperLinkManagerShell.java
@@ -0,0 +1,415 @@
+/*****************************************************************************
+ * Copyright (c) 2009 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ * Arthut Daussy (Atos) arthur.daussy@atos.net - Bug 363827 - [Improvement] Diagram creation, remember the latest tab chosen
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper;
+import org.eclipse.papyrus.infra.hyperlink.helper.HyperLinkHelperFactory;
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkException;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkTabsRegistrationUtil;
+import org.eclipse.papyrus.infra.ui.editorsfactory.IPageIconsRegistry;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.WorkbenchException;
+import org.eclipse.ui.XMLMemento;
+
+/**
+ * The Class HyperLinkManagerShell2.
+ */
+public class HyperLinkManagerShell extends AbstractHyperLinkManagerShell {
+
+ /**
+ * Memento's name to store Hyper Link Shell data
+ */
+ private static final String HYPER_LINK_SHELL_MEMENTO = "HYPER_LINK_SHELL_MEMENTO"; //$NON-NLS-1$
+
+ /**
+ * Memento's name to store index of the last tab used for a specific element type
+ */
+ private static final String LAST_TAB_USE_MEMENTO = "LAST_TAB_USE_MEMENTO"; //$NON-NLS-1$
+
+ /**
+ * Memento's name to store index of the last tab (for all element)
+ */
+ protected static final String LAST_GLOBAL_TAB_USED = "LAST_USED_MEMENTO"; //$NON-NLS-1$
+
+ /**
+ * The command to execute to set the new eannotation
+ */
+ private CompoundCommand cmd;
+
+ final protected List<HyperLinkObject> allhypHyperlinkObjects = new ArrayList<HyperLinkObject>();
+
+ /** The graphical representation of the element (a View in GMF) */
+ protected EModelElement view;
+
+ protected EObject semanticElement;
+
+ /** The domain. */
+ protected TransactionalEditingDomain transactionalEditingDomain;
+
+ protected HyperLinkHelperFactory hyperLinkHelperFactory;
+
+
+
+ public void setInput(List<HyperLinkObject> hyperLinkObjectList) {
+ this.allhypHyperlinkObjects.clear();
+ this.allhypHyperlinkObjects.addAll(hyperLinkObjectList);
+ Iterator<AbstractHyperLinkTab> iter = tabList.iterator();
+ while (iter.hasNext()) {
+ AbstractHyperLinkTab hyperLinkTab = iter.next();
+ hyperLinkTab.setInput(allhypHyperlinkObjects);
+ }
+ }
+
+ /**
+ * Instantiates a new hyper link manager shell2.
+ *
+ * @param editorFactoryRegistry
+ * the editor factory registry
+ * @param model
+ * the model that contains all elements
+ * @param domain
+ * the domain inorder to execute command
+ * @param umlElement
+ * the uml element linked to the view
+ * @param aview
+ * the aview of the uml element
+ */
+ public HyperLinkManagerShell(IPageIconsRegistry editorFactoryRegistry, TransactionalEditingDomain domain, EModelElement semanticElement, EModelElement aview, HyperLinkHelperFactory hyperHelperFactory) {
+ super();
+ this.hyperLinkHelperFactory = hyperHelperFactory;
+ this.view = aview;
+ this.semanticElement = semanticElement;
+ this.transactionalEditingDomain = domain;
+ createHyperLinkShell();
+
+ initializeFolder(null);
+
+ // // associate tableViewer for each table
+ // Iterator<AbstractHyperLinkHelper> iter = hyperHelperFactory.getHyperLinkHelpers().iterator();
+ // while(iter.hasNext()) {
+ // AbstractHyperLinkHelper abstractHyperLinkHelper = (AbstractHyperLinkHelper)iter.next();
+ // initializeFolder(abstractHyperLinkHelper);
+ // }
+ // listener for the button cancel
+ getCancelButton().addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ tabList.clear();
+ getHyperLinkShell().close();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ };
+ });
+ // listener for the button OK
+ SelectionListener okListener = new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ executeOkButton();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ };
+ getOkButton().addSelectionListener(okListener);
+ }
+
+ protected void executeOkButton() {// should be final?
+ CompoundCommand myCommand = getCommand();
+ // clear the current annotations
+ myCommand.append(HyperLinkHelperFactory.getEmptyAllHyperLinkCommand(transactionalEditingDomain, view));
+ doAction();
+
+ // store eannotation command
+ try {
+ myCommand.append(hyperLinkHelperFactory.getAddHyperLinkCommand(transactionalEditingDomain, view, allhypHyperlinkObjects));
+ } catch (HyperLinkException e) {
+ Activator.log.error(e);
+ }
+
+ // execute the command
+ Assert.isTrue(myCommand.canExecute());
+ this.transactionalEditingDomain.getCommandStack().execute(myCommand);
+ closeDialog();
+ }
+
+
+
+ /**
+ * do the action and fill the command
+ */
+ protected void doAction() {
+ // empty all hyperlinks
+ // clear command
+ // CompoundCommand tmp = getCommand();
+ // tmp.append(HyperLinkHelperFactory.getEmptyAllHyperLinkCommand(transactionalEditingDomain, view));
+
+
+ allhypHyperlinkObjects.clear();
+ allhypHyperlinkObjects.addAll(getSelectedHyperLinkObjectCrossingTabs());
+ // set all hyper links is default to false
+ Iterator<HyperLinkObject> iterator = allhypHyperlinkObjects.iterator();
+ while (iterator.hasNext()) {
+ HyperLinkObject hyperLink = iterator.next();
+ hyperLink.setIsDefault(false);
+ }
+
+
+ // specific behavior for the DefautHyperLinkTab
+ DefaultHyperLinkTab defaultHyperLinkTab = getDefaultHyperLinkTab();
+
+ // look for all hyperlink default and put it as default at the top of the list
+ int i = defaultHyperLinkTab.getDefaultHyperLinkObject().size() - 1;
+ while (i >= 0) {
+ HyperLinkObject hyperLinkObject = defaultHyperLinkTab.getDefaultHyperLinkObject().get(i);
+ hyperLinkObject.setIsDefault(true);
+ if (allhypHyperlinkObjects.contains(hyperLinkObject)) {
+ allhypHyperlinkObjects.remove(hyperLinkObject);
+ allhypHyperlinkObjects.add(0, hyperLinkObject);
+ }
+ i--;
+ }
+
+ // //store eannotation command
+ // try {
+ // tmp.append(hyperLinkHelperFactory.getAddHyperLinkCommand(transactionalEditingDomain, view, allhypHyperlinkObjects));
+ // } catch (HyperLinkException e) {
+ // Activator.log.error(e);
+ // }
+ }
+
+ private void closeDialog() {
+ // save the corresponding tab
+ saveCorrespondingTab();
+ tabList.clear();
+ getHyperLinkShell().close();
+ }
+
+ protected CompoundCommand getCommand() {
+ if (cmd == null) {
+ cmd = new CompoundCommand(Messages.HyperLinkManagerShell_HyperLinksCommands);
+ }
+ return cmd;
+ }
+
+ /**
+ * Initialize diagram folder.
+ */
+ public void initializeFolder(final AbstractHyperLinkHelper abstractHyperLinkHelper) { // TODO remove this parameter which is not used!
+ Iterator<AbstractHyperLinkTab> iter = HyperLinkTabsRegistrationUtil.INSTANCE.getAllHyperLinkTab().iterator();
+ while (iter.hasNext()) {
+ AbstractHyperLinkTab current = iter.next();
+ current.init(getcTabFolder(), allhypHyperlinkObjects, semanticElement);
+ tabList.add(current);
+ }
+
+ // specific behavior for the default tab :
+ final DefaultHyperLinkTab defaultTab = getDefaultHyperLinkTab();
+ defaultTab.getMainComposite().addListener(SWT.Show, new Listener() {
+
+ public void handleEvent(Event event) {
+ defaultTab.setInput(HyperLinkManagerShell.this.getSelectedHyperLinkObjectCrossingTabs());
+ }
+ });
+
+ }
+
+ /**
+ * Open the shell.
+ */
+ public void open() {
+ Display display = Display.getCurrent();
+ getHyperLinkShell().pack();
+ // getHyperLinkShell().setBounds(500, 500, 700, 300);
+ getHyperLinkShell().open();
+ // Select the good tab
+ selectLastTab();
+ // code use to wait for an action from the user
+ while (!getHyperLinkShell().isDisposed()) {
+ if (!display.readAndDispatch()) {
+ display.sleep();
+ }
+ }
+ }
+
+ /**
+ * Save the last tab used for the specific element and the global last tab used
+ *
+ * @param rootMemento
+ * {@link IMemento} use to save information about last tab used
+ */
+ protected void saveCorrespondingTab() {
+ IMemento rootMemento = getExistingHPMemento();
+ IMemento memento = getLastTabUseMemento(rootMemento);
+ if (semanticElement != null) {
+ // Save the corresponding tab for the element
+ // Use InstanceTypeName in order to make a convenient ID
+ int selectionIndex = getcTabFolder().getSelectionIndex();
+ memento.putInteger(semanticElement.eClass().getInstanceTypeName(), selectionIndex);
+ // Save the global last tab used
+ memento.putInteger(LAST_GLOBAL_TAB_USED, selectionIndex);
+ }
+ saveMemento((XMLMemento) rootMemento, HYPER_LINK_SHELL_MEMENTO);
+ }
+
+ /**
+ * Select the last tab used.
+ * If an element of the same type has already been encountered then it open the last tab used for this type
+ * else open the last tab used for all element
+ */
+ protected void selectLastTab() {
+ IMemento rootMemento = getExistingHPMemento();
+ Integer lastIndexUsed = null;
+ if (semanticElement != null) {
+ lastIndexUsed = getLastTabUseMemento(rootMemento, semanticElement.eClass().getInstanceTypeName());
+ }
+ if (lastIndexUsed == null) {
+ lastIndexUsed = getLastTabUseMemento(rootMemento, LAST_GLOBAL_TAB_USED);
+ if (lastIndexUsed == null) {
+ lastIndexUsed = 0;
+ }
+ }
+ try {
+ getcTabFolder().setSelection(lastIndexUsed);
+ } catch (IndexOutOfBoundsException e) {
+ getcTabFolder().setSelection(0);
+ }
+ }
+
+ /**
+ * Save the the moment into the Preference store
+ *
+ * @param xmlMemento
+ * @param key
+ */
+ public static void saveMemento(XMLMemento xmlMemento, String key) {
+ // save memento
+ StringWriter writer = new StringWriter();
+ try {
+ xmlMemento.save(writer);
+ if (getPreferenceStore() != null) {
+ getPreferenceStore().setValue(key, writer.toString());
+ }
+ } catch (IOException e) {
+ Activator.log.error(Messages.HyperLinkManagerShell_InputOutputException, e);
+ }
+ }
+
+ /**
+ * Retrieves the root memento for Hyper Link Date Shell data from the plugin preferences if any or create a new one if none
+ *
+ * @return the root memento for Hyper Links Data
+ */
+ public static IMemento getExistingHPMemento() {
+ String sValue = getPreferenceStore().getString(HYPER_LINK_SHELL_MEMENTO);
+ try {
+ if (sValue != null && !sValue.equals("")) { //$NON-NLS-1$
+ XMLMemento rootMemento = XMLMemento.createReadRoot(new StringReader(sValue));
+ return rootMemento;
+ } else {
+ return XMLMemento.createWriteRoot(HYPER_LINK_SHELL_MEMENTO);
+ }
+ } catch (WorkbenchException e) {
+ Activator.log.error(Messages.HyperLinkManagerShell_ImpossibleToReadPreferences, e);
+ }
+ return null;
+ }
+
+ /**
+ * Return the index of the last tab used for the type (represented by semantic hinted) or null if none
+ *
+ * @param rootMemento
+ * Root memento used for Hyper Link Data
+ * @param elementSemanticHint
+ * String to represent the EClass of the EObject
+ * @return
+ */
+ public static Integer getLastTabUseMemento(IMemento rootMemento, String elementSemanticHint) {
+ IMemento lastTabUsedMemento = getLastTabUseMemento(rootMemento);
+ if (lastTabUsedMemento != null) {
+ return lastTabUsedMemento.getInteger(elementSemanticHint);
+ }
+ return null;
+ }
+
+ /**
+ * @param memento
+ * @return
+ */
+ protected static IMemento getLastTabUseMemento(IMemento memento) {
+ IMemento lastTabUsedMemento = memento.getChild(LAST_TAB_USE_MEMENTO);
+ if (lastTabUsedMemento == null) {
+ lastTabUsedMemento = memento.createChild(LAST_TAB_USE_MEMENTO);
+ }
+ return lastTabUsedMemento;
+ }
+
+ private static IPreferenceStore getPreferenceStore() {
+ return Activator.getDefault().getPreferenceStore();
+ }
+
+ // TODO : should be a set ?
+ public List<HyperLinkObject> getSelectedHyperLinkObjectCrossingTabs() {
+ Set<HyperLinkObject> selectedObjects = new HashSet<HyperLinkObject>();
+ for (AbstractHyperLinkTab current : tabList) {
+ if (!(current instanceof DefaultHyperLinkTab)) {
+ List<HyperLinkObject> tmp = current.getHyperlinkObjects();
+ if (tmp != null) {
+ selectedObjects.addAll(tmp);
+ }
+ }
+ }
+ return new ArrayList<HyperLinkObject>(selectedObjects);
+ }
+
+ protected DefaultHyperLinkTab getDefaultHyperLinkTab() {
+ int nbTab = 0;
+ DefaultHyperLinkTab defaultHyperLinkTab = null;
+ for (AbstractHyperLinkTab current : tabList) {
+ if (current instanceof DefaultHyperLinkTab) {
+ defaultHyperLinkTab = (DefaultHyperLinkTab) current;
+ nbTab++;
+ }
+ }
+ // there is only one DefaultHyperLinkTab in the dialog!
+ Assert.isTrue(nbTab == 1);
+ Assert.isNotNull(defaultHyperLinkTab);
+ return defaultHyperLinkTab;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/HyperLinkTab.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/HyperLinkTab.java
new file mode 100644
index 00000000000..9d916a5589e
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/ui/HyperLinkTab.java
@@ -0,0 +1,413 @@
+/*****************************************************************************
+ * Copyright (c) 2011, 2013 CEA LIST 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ * Christian W. Damus (CEA LIST) - Consolidate all hyperlink helper contributions into one tab
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.ui;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper;
+import org.eclipse.papyrus.infra.hyperlink.helper.CompositeHyperlinkHelper;
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.papyrus.infra.widgets.providers.CollectionContentProvider;
+import org.eclipse.papyrus.infra.widgets.util.PopupButtonMenu;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+
+/**
+ * this class is GUI that represent a tab for each kind of hyperlink
+ * for example a tab for diagram, for web links...
+ *
+ */
+
+// TODO change the methods to get images after the refactoring
+public class HyperLinkTab extends AbstractHyperLinkTab {
+
+ /**
+ * The Class DiagramContentProvider.
+ */
+ protected CTabItem hyperlinksTab;
+
+ protected Table hyperLinkListTable;
+
+ protected Button newHyperLinkbutton;
+
+ protected Button modifyHyperLinkButton;
+
+ protected Button removeHyperLinkButton;
+
+ protected Button upHyperLinkButton;
+
+ protected Button downHyperLinkButton;
+
+ protected TableViewer tableViewer;
+
+ /**
+ *
+ * Constructor.
+ *
+ */
+ public HyperLinkTab() {
+ // nothing to do
+ }
+
+ /**
+ *
+ * Constructor.
+ *
+ * @param tabId
+ * @param helpers
+ */
+ public HyperLinkTab(String tabId, Collection<? extends AbstractHyperLinkHelper> helpers) {
+ super(tabId, (helpers.size() == 1) ? helpers.iterator().next() : new CompositeHyperlinkHelper(helpers));
+ }
+
+ /**
+ * get TableVeiver
+ *
+ * @return
+ */
+ public TableViewer getTableViewer() {
+ return tableViewer;
+ }
+
+ /**
+ *
+ * @return the list of hyperlink displayed in the tab
+ */
+ @Override
+ public List<HyperLinkObject> getHyperlinkObjects() {
+ return hyperlinkObjects;
+ }
+
+ /**
+ * set list of hyperlinks to display in the tab
+ *
+ * @param hyperlinkObjects
+ */
+ public void setHyperlinkObjects(List<HyperLinkObject> hyperlinkObjects) {
+ this.hyperlinkObjects = hyperlinkObjects;
+ }
+
+
+ /**
+ *
+ * @see org.eclipse.papyrus.infra.hyperlink.ui.AbstractHyperLinkTab#init(org.eclipse.swt.custom.CTabFolder, java.util.List, org.eclipse.emf.ecore.EObject)
+ *
+ * @param cTabFolder
+ * @param hyperlinkObjects
+ * @param element
+ */
+ @Override
+ public void init(CTabFolder cTabFolder, List<HyperLinkObject> hyperlinkObjects, EObject element/* , IHyperLinkShell parent */) {
+ super.init(cTabFolder, hyperlinkObjects, element /* , parent */);
+ CTabItem cTabItem2 = new CTabItem(cTabFolder, SWT.NONE);
+ cTabItem2.setText(Messages.HyperLinkTab_title);
+ Composite diagramComposite = new Composite(cTabFolder, SWT.NONE);
+ cTabItem2.setControl(diagramComposite);
+ GridData gridData4 = new GridData();
+ gridData4.horizontalAlignment = GridData.FILL;
+ gridData4.verticalAlignment = GridData.CENTER;
+ GridData gridData3 = new GridData();
+ gridData3.horizontalAlignment = GridData.FILL;
+ gridData3.verticalAlignment = GridData.CENTER;
+ GridData gridData2 = new GridData();
+ gridData2.horizontalAlignment = GridData.FILL;
+ gridData2.verticalAlignment = GridData.CENTER;
+ GridData gridData1 = new GridData();
+ gridData1.verticalAlignment = GridData.FILL;
+ gridData1.grabExcessHorizontalSpace = true;
+ gridData1.grabExcessVerticalSpace = true;
+ gridData1.verticalSpan = 6;
+ gridData1.horizontalAlignment = GridData.FILL;
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ gridLayout.makeColumnsEqualWidth = false;
+
+ diagramComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ diagramComposite.setLayout(gridLayout);
+ CLabel listLabel = new CLabel(diagramComposite, SWT.SHADOW_NONE);
+ listLabel.setText(Messages.HyperLinkTab_Listof);
+ listLabel.setEnabled(false);
+ listLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+
+ new Label(diagramComposite, SWT.NONE);
+ hyperLinkListTable = new Table(diagramComposite, SWT.BORDER | SWT.MULTI);
+ tableViewer = new TableViewer(hyperLinkListTable);
+
+ newHyperLinkbutton = new Button(diagramComposite, SWT.PUSH);
+ newHyperLinkbutton.setText(""); //$NON-NLS-1$
+ newHyperLinkbutton.setImage(org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage("/icons/Add_16x16.gif")); //$NON-NLS-1$
+ newHyperLinkbutton.setLayoutData(gridData4);
+ newHyperLinkbutton.setToolTipText("New hyperlink");
+
+ hyperLinkListTable.setHeaderVisible(false);
+ hyperLinkListTable.setToolTipText(Messages.HyperLinkTab_SetOf);
+ hyperLinkListTable.setLayoutData(gridData1);
+ hyperLinkListTable.setLinesVisible(false);
+ modifyHyperLinkButton = new Button(diagramComposite, SWT.NONE);
+ modifyHyperLinkButton.setImage(org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage("/icons/Edit_16x16.gif")); //$NON-NLS-1$
+ modifyHyperLinkButton.setToolTipText("Edit hyperlink");
+
+ removeHyperLinkButton = new Button(diagramComposite, SWT.NONE);
+ removeHyperLinkButton.setText(""); //$NON-NLS-1$
+ removeHyperLinkButton.setImage(org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage("/icons/Delete_16x16.gif")); //$NON-NLS-1$
+ removeHyperLinkButton.setToolTipText("Remove hyperlink");
+
+ upHyperLinkButton = new Button(diagramComposite, SWT.NONE);
+ upHyperLinkButton.setImage(org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage("/icons/ArrowUp_16x16.gif")); //$NON-NLS-1$
+ upHyperLinkButton.setToolTipText("Move hyperlink up");
+
+ upHyperLinkButton.setLayoutData(gridData2);
+ downHyperLinkButton = new Button(diagramComposite, SWT.NONE);
+ downHyperLinkButton.setImage(org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage("/icons/ArrowDown_16x16.gif")); //$NON-NLS-1$
+ downHyperLinkButton.setToolTipText("Move hyperlink down");
+
+ downHyperLinkButton.setLayoutData(gridData3);
+ addListeners();
+ tableViewer.setContentProvider(CollectionContentProvider.instance);
+
+ this.hyperlinkObjects = hyperLinkHelper.getFilteredObject(hyperlinkObjects);
+
+ ILabelProvider provider = null;
+ if (element != null) {
+ try {
+ provider = ServiceUtilsForEObject.getInstance().getService(LabelProviderService.class, element).getLabelProvider();
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ }
+ }
+
+ if (provider == null) {
+ provider = new LabelProvider();
+ }
+
+ tableViewer.setLabelProvider(provider);
+ getTableViewer().setInput(this.hyperlinkObjects);
+ }
+
+ protected void addListeners() {
+ getRemoveHyperLinkButton().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ if (HyperLinkTab.this.getTableViewer().getTable().getSelection().length != 0) {
+ Iterator<?> iterator = ((IStructuredSelection) HyperLinkTab.this.getTableViewer().getSelection()).iterator();
+ while (iterator.hasNext()) {
+ Object object = iterator.next();
+ HyperLinkTab.this.getHyperlinkObjects().remove(object);
+ HyperLinkTab.this.getTableViewer().setInput(HyperLinkTab.this.getHyperlinkObjects());
+ }
+ }
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+
+ getUpHyperLinkButton().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ if (HyperLinkTab.this.getTableViewer().getTable().getSelection().length != 0) {
+ Object elt = ((IStructuredSelection) HyperLinkTab.this.getTableViewer().getSelection()).getFirstElement();
+ if (HyperLinkTab.this.getHyperlinkObjects().indexOf(elt) == 0) {
+ return;
+ }
+ Iterator<?> iterator = ((IStructuredSelection) HyperLinkTab.this.getTableViewer().getSelection()).iterator();
+ while (iterator.hasNext()) {
+ HyperLinkObject currentHyperLinkDoc = (HyperLinkObject) iterator.next();
+ int index = HyperLinkTab.this.getHyperlinkObjects().indexOf(currentHyperLinkDoc);
+ HyperLinkTab.this.getHyperlinkObjects().remove(currentHyperLinkDoc);
+ HyperLinkTab.this.getHyperlinkObjects().add(index - 1, currentHyperLinkDoc);
+ HyperLinkTab.this.getTableViewer().setInput(HyperLinkTab.this.getHyperlinkObjects());
+ }
+ }
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+
+ getDownHyperLinkButton().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ if (HyperLinkTab.this.getTableViewer().getTable().getSelection().length != 0) {
+ Object[] block = ((IStructuredSelection) HyperLinkTab.this.getTableViewer().getSelection()).toArray();
+ if ((HyperLinkTab.this.getHyperlinkObjects().indexOf(block[block.length - 1])) == HyperLinkTab.this.getHyperlinkObjects().size() - 1) {
+ return;
+ }
+ for (int i = block.length - 1; i >= 0; i--) {
+ HyperLinkObject currentobject = (HyperLinkObject) block[i];
+ int index = HyperLinkTab.this.getHyperlinkObjects().indexOf(currentobject);
+ HyperLinkTab.this.getHyperlinkObjects().remove(currentobject);
+ HyperLinkTab.this.getHyperlinkObjects().add(index + 1, currentobject);
+ HyperLinkTab.this.getTableViewer().setInput(HyperLinkTab.this.getHyperlinkObjects());
+ }
+ }
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+
+ final Runnable addHandler = new Runnable() {
+
+ public void run() {
+ HyperLinkTab.this.hyperLinkHelper.executeNewMousePressed(HyperLinkTab.this.getHyperlinkObjects(), HyperLinkTab.this.element);
+ HyperLinkTab.this.setInput(HyperLinkTab.this.getHyperlinkObjects());
+ }
+ };
+ if (!isCompositeHelper()) {
+ getNewHyperLinkbutton().addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ addHandler.run();
+ }
+ });
+ } else {
+ addNewHyperLinkMenuActions(addHandler);
+ }
+
+ getModifyHyperLinkButton().addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ if (HyperLinkTab.this.getTableViewer().getTable().getSelection().length != 0) {
+ HyperLinkObject hyperLinkObject = (HyperLinkObject) ((IStructuredSelection) HyperLinkTab.this.getTableViewer().getSelection()).getFirstElement();
+ HyperLinkTab.this.hyperLinkHelper.executeEditMousePressed(HyperLinkTab.this.getHyperlinkObjects(), hyperLinkObject, HyperLinkTab.this.element);
+ HyperLinkTab.this.setInput(HyperLinkTab.this.getHyperlinkObjects());
+ }
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+ });
+ }
+
+ private void addNewHyperLinkMenuActions(final Runnable addNewHyperlinkHandler) {
+ PopupButtonMenu menu = new PopupButtonMenu(getNewHyperLinkbutton());
+
+ for (final AbstractHyperLinkHelper helper : ((CompositeHyperlinkHelper) hyperLinkHelper).getHelpers()) {
+ IAction action = new Action(helper.getNameofManagedHyperLink()) {
+
+ @Override
+ public void run() {
+ ((CompositeHyperlinkHelper) hyperLinkHelper).setActiveHelper(helper);
+ addNewHyperlinkHandler.run();
+ }
+ };
+ action.setToolTipText(NLS.bind(Messages.HyperLinkTab_addTooltip, helper.getNameofManagedHyperLink()));
+
+ menu.addAction(action);
+ }
+ }
+
+ /**
+ *
+ * @return get the button to create a hyperlinkObject
+ */
+ private Button getNewHyperLinkbutton() {
+ return newHyperLinkbutton;
+ }
+
+ protected boolean isCompositeHelper() {
+ return hyperLinkHelper instanceof CompositeHyperlinkHelper;
+ }
+
+ /**
+ *
+ * @return the button to edit a hyperlinkObject
+ */
+
+ private Button getModifyHyperLinkButton() {
+ return modifyHyperLinkButton;
+ }
+
+ /**
+ *
+ * @return the button to remove a hyperlinkObject
+ */
+ private Button getRemoveHyperLinkButton() {
+ return removeHyperLinkButton;
+ }
+
+ /**
+ *
+ * @return the button to move up a hyperlinkObject
+ */
+ private Button getUpHyperLinkButton() {
+ return upHyperLinkButton;
+ }
+
+ /**
+ *
+ * @return the button to move down the hyperlinkObject
+ */
+ private Button getDownHyperLinkButton() {
+ return downHyperLinkButton;
+ }
+
+ /**
+ * set as input a list of hyperlinkObject to display
+ *
+ * @param hyperlinkObjects
+ * the lis of hyperlinkobjects
+ */
+ @Override
+ public void setInput(List<HyperLinkObject> hyperlinkObjects) {
+ if (!getTableViewer().getControl().isDisposed()) {
+ this.hyperlinkObjects = this.hyperLinkHelper.getFilteredObject(hyperlinkObjects);
+ getTableViewer().setInput(this.hyperlinkObjects);
+ } else {
+ Activator.log.warn("This hyperlink tab has been disposed");
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/EditorListContentProvider.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/EditorListContentProvider.java
new file mode 100644
index 00000000000..1b21ecf27ac
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/EditorListContentProvider.java
@@ -0,0 +1,97 @@
+/*****************************************************************************
+ * Copyright (c) 2011, 2016 CEA LIST, Christian W. Damus, 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:
+ * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 485220
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.papyrus.infra.core.sashwindows.di.service.IPageManager;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+
+
+/**
+ * The Class EditorListContentProvider.
+ */
+// TODO why a tree content provider
+public class EditorListContentProvider implements ITreeContentProvider {
+
+ // The context of the ContentProvider
+ private EObject model;
+
+ public EditorListContentProvider(EObject model) {
+ this.model = model;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Object[] getChildren(Object parentElement) {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Object[] getElements(Object inputElement) {
+ try {
+ IPageManager iPageMngr = ServiceUtilsForEObject.getInstance().getService(IPageManager.class, model);
+ Object[] result = iPageMngr.allPages().toArray();
+
+ List<Object> res = new ArrayList<Object>();
+ for (Object current : result) {
+ if (current != null /* && current instanceof PapyrusTableInstance */) {
+ // if the model is a little bit corrupted, we can have a null element in the list
+ res.add(current);
+ }
+ }
+ return res.toArray();
+
+ } catch (Exception e) {
+ Activator.log.error(e);
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void dispose() {
+ // nothing to do
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ // nothing to do
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkConstants.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkConstants.java
new file mode 100644
index 00000000000..17dea59555a
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkConstants.java
@@ -0,0 +1,67 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.util;
+
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+
+public final class HyperLinkConstants {
+
+ /**
+ *
+ * Constructor.
+ *
+ */
+ private HyperLinkConstants() {
+ // nothing to do
+ }
+
+ /**
+ * this is a key of eAnnnotation that contains hypertext link or referenced document
+ **/
+ public static final String PAPYRUS_HYPERLINK_PREFIX = "PapyrusHyperLink_"; //$NON-NLS-1$
+
+ public static final String PAPYRUS_HYPERLINK_PAGE = PAPYRUS_HYPERLINK_PREFIX + "Page"; //$NON-NLS-1$
+
+ public static final String PAPYRUS_HYPERLINK_SPECIFIC_ELEMENT = PAPYRUS_HYPERLINK_PREFIX + "Object"; //$NON-NLS-1$
+
+ public static final String HYPERLINK_DOCUMENT = PAPYRUS_HYPERLINK_PREFIX + "Document"; //$NON-NLS-1$
+
+ public static final String HYPERLINK_WEB = PAPYRUS_HYPERLINK_PREFIX + "_web"; //$NON-NLS-1$
+
+ public static final String HYPERLINK_TOOLTYPE_TEXT = "tooltip_text"; //$NON-NLS-1$
+
+ public static final String HYPERLINK_IS_DEFAULT_NAVIGATION = "is_default_navigation"; //$NON-NLS-1$
+
+ public static final String HYPERLINK_DOCUMENT_LOCALIZATION = "localization"; //$NON-NLS-1$
+
+ public static final String HYPERLINK_WEB_LINK = "link"; //$NON-NLS-1$
+
+ public static final String HYPERLINK_PAGE_NAME = "pageName"; //$NON-NLS-1$
+
+ /**
+ * LEGACY CONSTANTS
+ */
+
+ public static final String LEGACY_HYPERLINK_DIAGRAM = PAPYRUS_HYPERLINK_PREFIX + "Diagram";
+
+ public static final String LEGACY_HYPERLINK_TABLE = PAPYRUS_HYPERLINK_PREFIX + "Table";
+
+ public final static String[] validHyperLinkPageSources = new String[] { HyperLinkConstants.PAPYRUS_HYPERLINK_PAGE, HyperLinkConstants.LEGACY_HYPERLINK_DIAGRAM, HyperLinkConstants.LEGACY_HYPERLINK_TABLE };
+
+ /**
+ * Plugin constants
+ */
+
+ public static final String EXTENSION_ID = Activator.PLUGIN_ID + ".hyperlinkContributor";
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkException.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkException.java
new file mode 100644
index 00000000000..7cdab5ad097
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkException.java
@@ -0,0 +1,55 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.util;
+
+/**
+ * this is an exception that can be raised when hyperlinks are manipulated
+ *
+ */
+public class HyperLinkException extends Exception {
+
+ /**
+ * a serial version
+ */
+ private static final long serialVersionUID = 1L;
+
+
+ /**
+ * constructor
+ */
+ public HyperLinkException() {
+ }
+
+ /**
+ * @param message
+ */
+ public HyperLinkException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param cause
+ */
+ public HyperLinkException(Throwable cause) {
+ super(cause);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public HyperLinkException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkFilteredLabelProvider.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkFilteredLabelProvider.java
new file mode 100644
index 00000000000..574da550305
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkFilteredLabelProvider.java
@@ -0,0 +1,25 @@
+/*****************************************************************************
+ * Copyright (c) 2012 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.util;
+
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.services.labelprovider.service.IFilteredLabelProvider;
+
+
+public class HyperLinkFilteredLabelProvider extends HyperLinkLabelProvider implements IFilteredLabelProvider {
+
+ public boolean accept(Object element) {
+ return element instanceof HyperLinkObject;
+ }
+
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkHelpersRegistrationUtil.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkHelpersRegistrationUtil.java
new file mode 100644
index 00000000000..48dfe2c9c37
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkHelpersRegistrationUtil.java
@@ -0,0 +1,113 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ *
+ * 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:
+ * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.util;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper;
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+
+/**
+ *
+ * This class allows to get all registered helpers
+ *
+ */
+public class HyperLinkHelpersRegistrationUtil {
+
+ /**
+ * The extension point id for helpers
+ */
+ public static final String HYPERLINK_REGISTRATION_ID = "org.eclipse.papyrus.infra.hyperlink.registration"; //$NON-NLS-1$
+
+ /**
+ * The 3 parameters for of the helper extension point
+ */
+ public static final String HELPER = "helper"; //$NON-NLS-1$
+
+ public static final String TAB_ID = "tabId"; //$NON-NLS-1$
+
+ public static final String POSITION = "position"; //$NON-NLS-1$
+
+ /**
+ * A map sorting the helpers by position
+ */
+ private Map<Integer, AbstractHyperLinkHelper> map = null;
+
+ /**
+ * The instance of HyperLinkHelpersRegistrationUtil
+ */
+ public static final HyperLinkHelpersRegistrationUtil INSTANCE = new HyperLinkHelpersRegistrationUtil();
+
+ /**
+ *
+ * Constructor.
+ *
+ */
+ private HyperLinkHelpersRegistrationUtil() {
+ // nothing to do
+ }
+
+ /**
+ *
+ * @return
+ * the list of registered helpers
+ */
+ public Collection<AbstractHyperLinkHelper> getAllRegisteredHyperLinkHelper() {
+ if (map == null) {
+ getHelperWithPosition();
+ }
+ return map.values();
+ }
+
+ /**
+ *
+ * @return
+ * a map owning the registered helpers, sorted by position
+ */
+ public Map<Integer, AbstractHyperLinkHelper> getHelperWithPosition() {
+ if (map == null) {
+ map = new TreeMap<Integer, AbstractHyperLinkHelper>();
+ IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(HYPERLINK_REGISTRATION_ID);
+ for (IConfigurationElement e : config) {
+ AbstractHyperLinkHelper helper = null;
+ try {
+ final Object h = e.createExecutableExtension(HELPER);
+ if (h instanceof AbstractHyperLinkHelper) {
+ helper = (AbstractHyperLinkHelper) h;
+ String o = e.getAttribute(POSITION);
+ Integer order = Integer.valueOf(o);
+ String tabId = e.getAttribute(TAB_ID);
+ helper.setTabId(tabId);
+ map.put(order, helper);
+ } else {
+ Activator.log.info(NLS.bind(Messages.HyperLinkTabRegistrationUtil_NotAnInstanceOf, new Object[] { h, AbstractHyperLinkHelper.class }));
+ }
+ } catch (NumberFormatException exception) {
+ Activator.log.error(NLS.bind(Messages.HyperLinkHelpersRegistrationUtil_TheHelperWillBeIgnored, helper), exception);
+ } catch (CoreException ex) {
+ Activator.log.error(Messages.HyperLinkHelpersRegistrationUtil_ICantCreateTheClassForAnHelper, ex);
+ }
+ }
+ }
+
+ return map;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkLabelProvider.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkLabelProvider.java
new file mode 100644
index 00000000000..61b280efd1e
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkLabelProvider.java
@@ -0,0 +1,238 @@
+/*****************************************************************************
+ * Copyright (c) 2011, 2016 CEA LIST, Christian W. Damus, 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 485220
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.util;
+
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+import java.awt.image.DirectColorModel;
+import java.awt.image.IndexColorModel;
+import java.awt.image.WritableRaster;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.imageio.ImageIO;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.filechooser.FileSystemView;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkDocument;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkSpecificObject;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkWeb;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.PaletteData;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * The Class DocumentLabelProvider.
+ */
+public class HyperLinkLabelProvider extends LabelProvider {
+
+ /** The HYPERLIN k_ we b_ ico n_ path. */
+ protected final String HYPERLINK_WEB_ICON_PATH = "/icons/hyperlink.gif"; //$NON-NLS-1$
+
+ /** The HYPERLIN k_ documen t_ ico n_ path. */
+ protected final String HYPERLINK_DOCUMENT_ICON_PATH = "/icons/file.gif"; //$NON-NLS-1$
+
+ /** The SEP. */
+ private final String SEP = " - "; //$NON-NLS-1$
+
+ /**
+ * {@inheritedDoc}.
+ *
+ * @param element
+ * the element
+ *
+ * @return the image
+ */
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof HyperLinkDocument) {
+ File theDoc = new File(((HyperLinkDocument) element).getHyperlinkDocument());
+ if (theDoc != null) {
+ FileSystemView view = FileSystemView.getFileSystemView();
+ Icon icon = view.getSystemIcon(theDoc);
+ if (icon instanceof ImageIcon) {
+ ImageData imageData = convertAWTImageToSWT(((ImageIcon) icon).getImage());
+ if (imageData != null) {
+ return new Image(Display.getDefault(), imageData);
+ }
+ }
+ }
+
+ return org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage(Activator.PLUGIN_ID, HYPERLINK_DOCUMENT_ICON_PATH);
+ }
+
+ if (element instanceof HyperLinkWeb) {
+ try {
+ InputStream stream = getRawStreamFromURL(new URL("http://www.google.com/s2/favicons?domain=" + ((HyperLinkWeb) element).getHyperLinkWeb()));
+ if (stream != null) {
+ try {
+ BufferedImage image = ImageIO.read(stream);
+ ImageData imageData = convertAWTImageToSWT(image);
+ if (imageData != null) {
+ return new Image(Display.getDefault(), imageData);
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ } catch (MalformedURLException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage(Activator.PLUGIN_ID, HYPERLINK_WEB_ICON_PATH);
+ }
+
+ if (element instanceof HyperLinkSpecificObject) {
+ EObject targetElement = ((HyperLinkSpecificObject) element).getTargetElement();
+ if (targetElement != null) {
+ try {
+ return ServiceUtilsForEObject.getInstance().getService(LabelProviderService.class, targetElement).getLabelProvider().getImage(targetElement);
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ }
+ }
+ }
+
+ return super.getImage(element);
+ }
+
+ /**
+ * {@inheritedDoc}.
+ *
+ * @param element
+ * the element
+ *
+ * @return the text
+ */
+ @Override
+ public String getText(Object element) {
+ String out = ""; //$NON-NLS-1$
+ if (element instanceof HyperLinkDocument) {
+ out = ((HyperLinkDocument) element).getHyperlinkDocument();
+ } else if (element instanceof HyperLinkWeb) {
+ out = ((HyperLinkWeb) element).getHyperLinkWeb();
+ } else if (element instanceof HyperLinkSpecificObject) {
+ EObject targetElement = ((HyperLinkSpecificObject) element).getTargetElement();
+ if (targetElement != null) {
+ try {
+ return ServiceUtilsForEObject.getInstance().getService(LabelProviderService.class, targetElement).getLabelProvider().getText(targetElement);
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ }
+ }
+ } else {
+ return super.getText(element);
+ }
+
+ out = ((HyperLinkObject) element).getTooltipText() + SEP + out;
+ return out;
+ }
+
+ public static ImageData convertAWTImageToSWT(java.awt.Image image) {
+ if (image == null) {
+ throw new IllegalArgumentException("Null 'image' argument.");
+ }
+ int w = image.getWidth(null);
+ int h = image.getHeight(null);
+ if (w == -1 || h == -1) {
+ return null;
+ }
+ BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+ Graphics g = bi.getGraphics();
+ g.drawImage(image, 0, 0, null);
+ g.dispose();
+ return convertToSWT(bi);
+ }
+
+ public static ImageData convertToSWT(BufferedImage bufferedImage) {
+ if (bufferedImage.getColorModel() instanceof DirectColorModel) {
+ DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel();
+ PaletteData palette = new PaletteData(colorModel.getRedMask(),
+ colorModel.getGreenMask(), colorModel.getBlueMask());
+ ImageData data = new ImageData(bufferedImage.getWidth(),
+ bufferedImage.getHeight(), colorModel.getPixelSize(),
+ palette);
+ WritableRaster raster = bufferedImage.getRaster();
+ int[] pixelArray = new int[3];
+ for (int y = 0; y < data.height; y++) {
+ for (int x = 0; x < data.width; x++) {
+ raster.getPixel(x, y, pixelArray);
+ int pixel = palette.getPixel(new RGB(pixelArray[0],
+ pixelArray[1], pixelArray[2]));
+ data.setPixel(x, y, pixel);
+ }
+ }
+ return data;
+ } else if (bufferedImage.getColorModel() instanceof IndexColorModel) {
+ IndexColorModel colorModel = (IndexColorModel) bufferedImage.getColorModel();
+ int size = colorModel.getMapSize();
+ byte[] reds = new byte[size];
+ byte[] greens = new byte[size];
+ byte[] blues = new byte[size];
+ colorModel.getReds(reds);
+ colorModel.getGreens(greens);
+ colorModel.getBlues(blues);
+ RGB[] rgbs = new RGB[size];
+ for (int i = 0; i < rgbs.length; i++) {
+ rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF,
+ blues[i] & 0xFF);
+ }
+ PaletteData palette = new PaletteData(rgbs);
+ ImageData data = new ImageData(bufferedImage.getWidth(),
+ bufferedImage.getHeight(), colorModel.getPixelSize(),
+ palette);
+ data.transparentPixel = colorModel.getTransparentPixel();
+ WritableRaster raster = bufferedImage.getRaster();
+ int[] pixelArray = new int[1];
+ for (int y = 0; y < data.height; y++) {
+ for (int x = 0; x < data.width; x++) {
+ raster.getPixel(x, y, pixelArray);
+ data.setPixel(x, y, pixelArray[0]);
+ }
+ }
+ return data;
+ }
+ return null;
+ }
+
+ protected InputStream getRawStreamFromURL(URL url) {
+ try {
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setDoInput(true);
+ connection.connect();
+ InputStream input = connection.getInputStream();
+ return input;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkTabsRegistrationUtil.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkTabsRegistrationUtil.java
new file mode 100644
index 00000000000..ed9d0d47259
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/HyperLinkTabsRegistrationUtil.java
@@ -0,0 +1,107 @@
+/*****************************************************************************
+ * Copyright (c) 2011, 2013 CEA LIST 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:
+ * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ * Christian W. Damus (CEA LIST) - Consolidate all hyperlink helper contributions into one tab
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.hyperlink.util;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper;
+import org.eclipse.papyrus.infra.hyperlink.messages.Messages;
+import org.eclipse.papyrus.infra.hyperlink.ui.AbstractHyperLinkTab;
+import org.eclipse.papyrus.infra.hyperlink.ui.HyperLinkTab;
+
+/**
+ *
+ * This class creates all the tabs for the HyperLink Shell
+ *
+ */
+public class HyperLinkTabsRegistrationUtil {
+
+ /**
+ * The id to get the registered hyperlink tab
+ */
+ public static final String HYPERLINK_TAB_REGISTRATION_ID = "org.eclipse.papyrus.infra.hyperlink.tab.registration"; //$NON-NLS-1$
+
+ /**
+ * The 3 parameters for of the tab extension point
+ */
+ public static final String TAB = "tab"; //$NON-NLS-1$
+
+ public static final String POSITION = "position"; //$NON-NLS-1$
+
+ public static final String TAB_ID = "tabId"; //$NON-NLS-1$
+
+ /** The ID of the tab that shows helper-based contributions. */
+ private static final String GENERIC_TAB_ID = "org.eclipse.papyrus.infra.hyperlink.helpers"; //$NON-NLS-1$
+
+ /** the instance of HyperLinkTabsRegistrationUtil */
+ public static final HyperLinkTabsRegistrationUtil INSTANCE = new HyperLinkTabsRegistrationUtil();
+
+ /**
+ *
+ * Constructor.
+ *
+ */
+ private HyperLinkTabsRegistrationUtil() {
+ // nothing to do
+ }
+
+ /**
+ *
+ * @return
+ * the tabs for the HyperLink Shell, sorted by position
+ */
+ public Collection<AbstractHyperLinkTab> getAllHyperLinkTab() {
+ // should not be a global variable, because we should create the tabs each time!
+ final Map<Integer, AbstractHyperLinkTab> allTabs;
+ allTabs = new TreeMap<Integer, AbstractHyperLinkTab>();
+ IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(HYPERLINK_TAB_REGISTRATION_ID);
+ for (IConfigurationElement e : config) {
+ AbstractHyperLinkTab tab = null;
+ try {
+ final Object h = e.createExecutableExtension(TAB);
+ if (h instanceof AbstractHyperLinkTab) {
+ tab = (AbstractHyperLinkTab) h;
+ final String o = e.getAttribute(POSITION);
+ final Integer position = Integer.valueOf(o);
+ final String tabId = e.getAttribute(TAB_ID);
+ tab.setTabId(tabId);
+ allTabs.put(position, tab);
+ } else {
+ Activator.log.info(NLS.bind(Messages.HyperLinkTabRegistrationUtil_NotAnInstanceOf, new Object[] { h, AbstractHyperLinkTab.class }));
+ }
+ } catch (NumberFormatException ex) {
+ Activator.log.error(NLS.bind(Messages.HyperLinkTabRegistrationUtil_tabWillBeIgnored, tab), ex);
+ } catch (CoreException ex) {
+ Activator.log.error(Messages.HyperLinkTabRegistrationUtil_ICantCreateTheTab, ex);
+ }
+ }
+
+ // we create the tab for the helpers
+ Map<Integer, AbstractHyperLinkHelper> helpers = HyperLinkHelpersRegistrationUtil.INSTANCE.getHelperWithPosition();
+ if (!helpers.isEmpty()) {
+ // use the least position requested by the helpers as the tab position
+ allTabs.put(helpers.keySet().iterator().next(), new HyperLinkTab(GENERIC_TAB_ID, helpers.values()));
+ }
+
+ return allTabs.values();
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/TreeViewContentProvider.java b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/TreeViewContentProvider.java
new file mode 100644
index 00000000000..fd52a6222bf
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.hyperlink/src/org/eclipse/papyrus/infra/hyperlink/util/TreeViewContentProvider.java
@@ -0,0 +1,64 @@
+/*****************************************************************************
+ * Copyright (c) 2015 CEA LIST 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:
+ * CEA LIST - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.hyperlink.util;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.ui.emf.providers.strategy.SemanticEMFContentProvider;
+
+/**
+ * Specific content provider for the tree view of the "views" dialog to choose a diagram for a hyperlink
+ */
+public class TreeViewContentProvider extends SemanticEMFContentProvider {
+ public TreeViewContentProvider(EObject[] roots) {
+ super(null, null, roots);
+ }
+
+ @Override
+ public boolean hasChildren(Object element) {
+ return super.getChildren(element).length > 0;
+ }
+
+ /**
+ *
+ * @see org.eclipse.papyrus.infra.ui.emf.providers.MoDiscoContentProvider#getChildren(java.lang.Object)
+ *
+ * @param parentElement
+ * @return
+ */
+ // in some case we return diagram twice!
+ // TODO the best correction we be able to manage applied facet, because if we get diagram twice it is probably because there are 2 facets with the same behavior applied
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ Set<Object> alreadyVisited = new HashSet<Object>();
+ List<Object> returnedChildren = new ArrayList<Object>();
+ Object[] children = super.getChildren(parentElement);
+ for (Object current : children) {
+ EObject el = EMFHelper.getEObject(current);
+ if (el != null) {
+ if (!alreadyVisited.contains(el)) {
+ returnedChildren.add(current);
+ alreadyVisited.add(el);
+ }
+ }
+ }
+ return returnedChildren.toArray();
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.classpath b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.classpath
new file mode 100644
index 00000000000..64c5e31b7a2
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.classpath
@@ -0,0 +1,7 @@
+<?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/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.project b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.project
new file mode 100644
index 00000000000..230921e2566
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.infra.psf</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.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..c585cc455ae
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,291 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+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_binary_expression=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_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=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_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=0
+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=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+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=true
+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=260
+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=4
+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_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not 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=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not 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_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_binary_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=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_lambda_arrow=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_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_unary_operator=do not 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_binary_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_lambda_arrow=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_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_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=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+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=260
+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=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+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_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.settings/org.eclipse.jdt.ui.prefs b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..954281dbc31
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,68 @@
+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=false
+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=false
+cleanup.format_source_code=false
+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=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=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=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_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_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_Papyrus
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_profile=_Papyrus
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+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\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><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">/**\n * Constructor.\n *\n * ${tags}\n */</template><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">/*****************************************************************************\n * Copyright (c) ${year} CEA LIST and others.\n * \n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * CEA LIST - Initial API and implementation\n * \n *****************************************************************************/\n</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><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">/**\n * ${see_to_overridden}\n *\n * ${tags}\n */</template><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">/**\n * ${see_to_target}\n *\n * ${tags}\n */</template><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}\n${package_declaration}\n\n${typecomment}\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">\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">\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">\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">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" 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}\n// ${todo} Auto-generated constructor stub</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>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/META-INF/MANIFEST.MF b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..ecd28c81214
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.team.core;bundle-version="3.7.0",
+ org.eclipse.core.resources;bundle-version="3.8.100",
+ org.eclipse.team.ui;bundle-version="3.7.0",
+ org.eclipse.papyrus.infra.core.log;bundle-version="1.2.0",
+ org.eclipse.ui.ide;bundle-version="3.9.0"
+Bundle-Vendor: Eclipse Modeling Project
+Bundle-ActivationPolicy: lazy
+Bundle-Version: 1.2.0.qualifier
+Bundle-Name: Papyrus PSF support
+Bundle-Activator: org.eclipse.papyrus.infra.psf.Activator
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.papyrus.infra.psf;singleton:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/about.html b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/about.html
new file mode 100644
index 00000000000..460233046ee
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/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 2, 2006</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> \ No newline at end of file
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/build.properties b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/build.properties
new file mode 100644
index 00000000000..101ae799c1e
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ about.html,\
+ plugin.xml
+src.includes = about.html
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/plugin.xml b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/plugin.xml
new file mode 100644
index 00000000000..4d215846f6a
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/plugin.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ defaultHandler="org.eclipse.papyrus.infra.psf.handler.ImportPSFHandler"
+ description="Imports a Team Project Set File (Psf) in background"
+ id="org.eclipse.papyrus.infra.psf.import"
+ name="Import PSF (Background)">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ allPopups="false"
+ locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions">
+ <command
+ commandId="org.eclipse.papyrus.infra.psf.import"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="selection">
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <adapt
+ type="org.eclipse.core.resources.IFile">
+ <test
+ property="org.eclipse.core.resources.extension"
+ value="psf">
+ </test>
+ </adapt>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+
+</plugin>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/pom.xml b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/pom.xml
new file mode 100644
index 00000000000..7ae0ea6c0fd
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/pom.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>org.eclipse.papyrus.infra-misc</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+ <artifactId>org.eclipse.papyrus.infra.psf</artifactId>
+ <version>1.2.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/Activator.java b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/Activator.java
new file mode 100644
index 00000000000..3f81fd59f77
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/Activator.java
@@ -0,0 +1,69 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.psf;
+
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.papyrus.infra.psf"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ public static LogHelper log;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ log = new LogHelper(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/handler/ImportPSFHandler.java b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/handler/ImportPSFHandler.java
new file mode 100644
index 00000000000..42da87958ee
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/handler/ImportPSFHandler.java
@@ -0,0 +1,163 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.psf.handler;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Iterator;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.operations.AbstractOperation;
+import org.eclipse.core.commands.operations.OperationHistoryFactory;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.papyrus.infra.psf.Activator;
+import org.eclipse.papyrus.infra.psf.runtime.ImportResult;
+import org.eclipse.papyrus.infra.psf.runtime.ProjectSetImporter;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Handles the ImportPSF command: org.eclipse.papyrus.infra.psf.import
+ *
+ * @author Camille Letavernier
+ *
+ */
+public class ImportPSFHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ final Shell activeShell = HandlerUtil.getActiveShell(event);
+ ISelection currentSelection = HandlerUtil.getCurrentSelection(event);
+
+ if (currentSelection instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) currentSelection;
+ if (selection.isEmpty()) {
+ return null;
+ }
+
+ Iterator<?> selectionIterator = selection.iterator();
+ while (selectionIterator.hasNext()) {
+ Object selectedElement = selectionIterator.next();
+ IFile file = (IFile) Platform.getAdapterManager().getAdapter(selectedElement, IFile.class);
+ if (file != null && "psf".equals(file.getLocation().getFileExtension())) { //$NON-NLS-1$
+ final String fileName = file.getLocation().toString();
+
+ Job job = new Job(String.format("Import %s", file.getName())) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ AbstractOperation operation = new ImportProjectSetOperation(getName(), fileName, activeShell);
+
+ try {
+ final IStatus result = OperationHistoryFactory.getOperationHistory().execute(operation, monitor, null);
+
+ if (monitor.isCanceled() || result.getSeverity() == IStatus.CANCEL) {
+ // TODO: Abort or Undo
+ }
+
+ return result;
+ } catch (ExecutionException ex) {
+ Activator.log.error(ex);
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, String.format("An error occurred when importing the PSF %s", fileName), ex);
+ }
+ }
+ };
+
+ job.setUser(true);
+ job.schedule();
+
+ job.setPriority(Job.LONG);
+
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public static class ImportProjectSetOperation extends AbstractOperation {
+
+ private String psfFileName;
+
+ private IProject[] importedProjects;
+
+ private Shell shell;
+
+ public ImportProjectSetOperation(String name, String psfFileName, Shell shell) {
+ super(name);
+ this.psfFileName = psfFileName;
+ this.shell = shell;
+ }
+
+ @Override
+ public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+ if (importedProjects == null || importedProjects.length == 0) {
+ return Status.OK_STATUS;
+ }
+ for (IProject project : importedProjects) {
+ try {
+ project.delete(false, true, monitor);
+ } catch (CoreException e) {
+ throw new ExecutionException(e.getMessage(), e);
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+ return execute(monitor, info);
+ }
+
+ @Override
+ public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+ try {
+ if (ProjectSetImporter.isValidProjectSetFile(psfFileName)) {
+ ImportResult result = ProjectSetImporter.importProjectSet(psfFileName, shell, monitor);
+ importedProjects = result.getImportedProjects();
+ if (!result.getDiagnostic().isEmpty()) {
+ if (result.getDiagnostic().size() == 1) {
+ return result.getDiagnostic().get(0);
+ } else {
+ IStatus[] status = result.getDiagnostic().toArray(new IStatus[0]);
+ int code = IStatus.OK;
+ for (IStatus currentStatus : status) {
+ if (currentStatus.getSeverity() > code) {
+ code = currentStatus.getSeverity();
+ }
+ }
+
+ IStatus resultStatus = new MultiStatus(Activator.PLUGIN_ID, code, status, "The following errors occurred during import:", null);
+ return resultStatus;
+ }
+ }
+ return Status.OK_STATUS;
+ } else {
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "The selected file is not a valid Project Set File");
+ }
+ } catch (InvocationTargetException ex) {
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, String.format("An error occurred when importing the PSF %s", psfFileName), ex);
+ }
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/runtime/ImportResult.java b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/runtime/ImportResult.java
new file mode 100644
index 00000000000..fdecd43f0fc
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/runtime/ImportResult.java
@@ -0,0 +1,46 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.psf.runtime;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * Represents the result of an Import PSF action.
+ * Contains the set of sucessfully imported projects,
+ * and a list of diagnostics
+ *
+ * @author Camille Letavernier
+ *
+ */
+public class ImportResult {
+
+ private IProject[] importedProjects;
+
+ private final List<IStatus> diagnostic = new LinkedList<IStatus>();
+
+ public IProject[] getImportedProjects() {
+ return importedProjects;
+ }
+
+ public void setImportedProjects(IProject[] importedProjects) {
+ this.importedProjects = importedProjects;
+ }
+
+ public List<IStatus> getDiagnostic() {
+ return diagnostic;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/runtime/ProjectSetImporter.java b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/runtime/ProjectSetImporter.java
new file mode 100644
index 00000000000..885830178ba
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/runtime/ProjectSetImporter.java
@@ -0,0 +1,471 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2012 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr
+ *******************************************************************************/
+package org.eclipse.papyrus.infra.psf.runtime;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.infra.psf.Activator;
+import org.eclipse.papyrus.infra.psf.ui.FilterProjectsDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.team.core.IProjectSetSerializer;
+import org.eclipse.team.core.ProjectSetCapability;
+import org.eclipse.team.core.ProjectSetSerializationContext;
+import org.eclipse.team.core.RepositoryProviderType;
+import org.eclipse.team.core.Team;
+import org.eclipse.team.core.TeamException;
+import org.eclipse.team.internal.core.TeamPlugin;
+import org.eclipse.team.internal.ui.TeamCapabilityHelper;
+import org.eclipse.team.internal.ui.TeamUIMessages;
+import org.eclipse.team.internal.ui.TeamUIPlugin;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.WorkbenchException;
+import org.eclipse.ui.XMLMemento;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+
+/**
+ * Initially copied from org.eclipse.team.internal.ui.ProjectSetImporter
+ */
+@SuppressWarnings({ "restriction", "deprecation" })
+public class ProjectSetImporter {
+
+ /**
+ * Imports a psf file based on a file content. This may be used when psf
+ * file is imported from any other location that local filesystem.
+ *
+ * @param psfContents
+ * the content of the psf file.
+ * @param filename
+ * the name of the source file. This is included in case the
+ * provider needs to deduce relative paths
+ * @param shell
+ * @param monitor
+ * @return list of new projects
+ * @throws InvocationTargetException
+ */
+ public static ImportResult importProjectSetFromString(String psfContents, String filename, Shell shell, IProgressMonitor monitor) throws InvocationTargetException {
+ XMLMemento xmlMemento = stringToXMLMemento(psfContents);
+ return importProjectSet(xmlMemento, filename, shell, monitor);
+ }
+
+ /**
+ * Imports a psf file.
+ *
+ * @param filename
+ * @param shell
+ * @param monitor
+ * @return list of new projects
+ * @throws InvocationTargetException
+ */
+ public static ImportResult importProjectSet(String filename, Shell shell, IProgressMonitor monitor) throws InvocationTargetException {
+ XMLMemento xmlMemento = filenameToXMLMemento(filename);
+ return importProjectSet(xmlMemento, filename, shell, monitor);
+ }
+
+ /**
+ * Differences with the base implementation:
+ *
+ * - User can select the projects to import
+ * - Projects are imported one by one (Instead of being imported provider by provider). The workspace is not locked during the import
+ * - Exceptions are caught and stored. They do not break the import
+ * - The method returns an ImportResult, containing the list of successfully imported projects and a diagnostic for errors
+ */
+ private static ImportResult importProjectSet(XMLMemento xmlMemento, String filename, Shell shell, IProgressMonitor mainMonitor) throws InvocationTargetException {
+
+ ImportResult result = new ImportResult();
+ final List<IStatus> diagnostic = result.getDiagnostic();
+
+ Map<String, List<String>> providersToProjects = filterProjects(xmlMemento, shell);
+
+ if (providersToProjects == null) {
+ mainMonitor.setCanceled(true);
+ return result;
+ }
+
+
+ try {
+ String version = xmlMemento.getString("version"); //$NON-NLS-1$
+
+ final List<IProject> newProjects = new ArrayList<IProject>();
+ if (version.equals("1.0")) { //$NON-NLS-1$
+ IProjectSetSerializer serializer = Team.getProjectSetSerializer("versionOneSerializer"); //$NON-NLS-1$
+ if (serializer != null) {
+ IProject[] projects = serializer.addToWorkspace(new String[0], filename, shell, new NullProgressMonitor());
+ if (projects != null) {
+ newProjects.addAll(Arrays.asList(projects));
+ }
+ }
+ } else {
+ final ProjectSetSerializationContext context = new ProjectSetSerializationContext(filename);
+
+ int nbProjects = 0;
+
+ for (List<String> projects : providersToProjects.values()) {
+ nbProjects += projects.size();
+ }
+
+ int nbWorkingSets = xmlMemento.getChildren("workingSets").length;
+
+ int totalWork = nbProjects + nbWorkingSets;
+
+ mainMonitor.beginTask(String.format("Importing %s projects", nbProjects), totalWork);
+
+ for (Map.Entry<String, List<String>> providerToProjects : providersToProjects.entrySet()) {
+ if (mainMonitor.isCanceled()) {
+ return result;
+ }
+
+ List<String> projects = providerToProjects.getValue();
+ String id = providerToProjects.getKey();
+
+ TeamCapabilityHelper.getInstance().processRepositoryId(id, PlatformUI.getWorkbench().getActivitySupport());
+ RepositoryProviderType providerType = RepositoryProviderType.getProviderType(id);
+ if (providerType == null) {
+ // The provider type is absent. Perhaps there is another provider that can import this type
+ providerType = TeamPlugin.getAliasType(id);
+ }
+
+ if (providerType == null) {
+ diagnostic.add(new Status(IStatus.ERROR, Activator.PLUGIN_ID, String.format("Unknown team provider: %s", id)));
+ mainMonitor.worked(projects.size());
+ continue;
+ }
+
+ final ProjectSetCapability serializer = providerType.getProjectSetCapability();
+ ProjectSetCapability.ensureBackwardsCompatible(providerType, serializer);
+
+ if (serializer != null) {
+ for (final String ref : projects) {
+
+ if (mainMonitor.isCanceled()) {
+ return result;
+ }
+
+ try {
+ IProgressMonitor monitor = new SubProgressMonitor(mainMonitor, 1);
+
+ final String projectName = getProjectName(serializer, ref);
+
+ mainMonitor.subTask(String.format("Importing %s...", projectName));
+
+ final List<IProject> importedProjects = new LinkedList<IProject>();
+
+ WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
+
+ @Override
+ protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
+ try {
+ IProject[] allProjects = serializer.addToWorkspace(new String[] { ref }, context, monitor);
+
+ if (allProjects != null) {
+ importedProjects.addAll(Arrays.asList(allProjects));
+ }
+ } catch (Exception ex) {
+ diagnostic.add(new Status(IStatus.ERROR, Activator.PLUGIN_ID, String.format("An error occurred when importing %s", projectName), ex));
+ }
+ }
+ };
+
+ operation.run(monitor);
+
+ // Refresh the new projects
+ for (IProject project : importedProjects) {
+ if (project == null) {
+ continue;
+ }
+ try {
+ project.refreshLocal(IResource.DEPTH_INFINITE, null);
+ } catch (CoreException ex) {
+ Activator.log.error(ex); // Not directly related to the import.
+ } catch (OperationCanceledException ex) {
+ // Ignore: The refresh workspace is cancel
+ }
+ }
+
+ newProjects.addAll(importedProjects);
+
+ } catch (InterruptedException ex) {
+ mainMonitor.setCanceled(true);
+ } catch (Exception ex) {
+ diagnostic.add(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "An error occurred when importing a project", ex));
+ }
+ }
+ }
+ }
+
+ // try working sets
+ IMemento[] sets = xmlMemento.getChildren("workingSets"); //$NON-NLS-1$
+ IWorkingSetManager wsManager = TeamUIPlugin.getPlugin().getWorkbench().getWorkingSetManager();
+ boolean replaceAll = false;
+ boolean mergeAll = false;
+ boolean skipAll = false;
+
+ mainMonitor.setTaskName(String.format("Creating %s working sets...", nbWorkingSets));
+
+ for (IMemento set : sets) {
+ if (mainMonitor.isCanceled()) {
+ return result;
+ }
+ mainMonitor.subTask(String.format("Working set %s", set.getString("label")));
+ IWorkingSet newWs = wsManager.createWorkingSet(set);
+ if (newWs != null) {
+ IWorkingSet oldWs = wsManager.getWorkingSet(newWs.getName());
+ if (oldWs == null) {
+ wsManager.addWorkingSet(newWs);
+ } else if (replaceAll) {
+ replaceWorkingSet(wsManager, newWs, oldWs);
+ } else if (mergeAll) {
+ mergeWorkingSets(newWs, oldWs);
+ } else if (!skipAll) {
+ // a working set with the same name has been found
+ String title = TeamUIMessages.ImportProjectSetDialog_duplicatedWorkingSet_title;
+ String msg = NLS.bind(TeamUIMessages.ImportProjectSetDialog_duplicatedWorkingSet_message, newWs.getName());
+ String[] buttons = new String[] { TeamUIMessages.ImportProjectSetDialog_duplicatedWorkingSet_replace, TeamUIMessages.ImportProjectSetDialog_duplicatedWorkingSet_merge,
+ TeamUIMessages.ImportProjectSetDialog_duplicatedWorkingSet_skip, IDialogConstants.CANCEL_LABEL };
+ final AdviceDialog dialog = new AdviceDialog(shell, title, null, msg, MessageDialog.QUESTION, buttons, 0);
+
+ shell.getDisplay().syncExec(new Runnable() {
+
+ public void run() {
+ dialog.open();
+ }
+ });
+
+ switch (dialog.getReturnCode()) {
+ case 0: // overwrite
+ replaceWorkingSet(wsManager, newWs, oldWs);
+ replaceAll = dialog.applyToAll;
+ break;
+ case 1: // combine
+ mergeWorkingSets(newWs, oldWs);
+ mergeAll = dialog.applyToAll;
+ break;
+ case 2: // skip
+ skipAll = dialog.applyToAll;
+ break;
+ case 3: // cancel
+ default:
+ mainMonitor.setCanceled(true);
+ }
+ }
+ }
+
+ mainMonitor.worked(1);
+ }
+ }
+
+ result.setImportedProjects(newProjects.toArray(new IProject[newProjects.size()]));
+
+ return result;
+ } catch (TeamException e) {
+ throw new InvocationTargetException(e);
+ }
+ }
+
+ private static Map<String, List<String>> filterProjects(XMLMemento xmlMemento, Shell shell) {
+ Map<String, List<String>> providersToProjects = new LinkedHashMap<String, List<String>>();
+
+ IMemento[] providers = xmlMemento.getChildren("provider"); //$NON-NLS-1$
+ for (IMemento provider : providers) {
+ IMemento[] projects = provider.getChildren("project"); //$NON-NLS-1$
+
+ List<String> references = getReferences(providersToProjects, provider.getString("id")); //$NON-NLS-1$
+
+ for (IMemento project : projects) {
+ references.add(project.getString("reference")); //$NON-NLS-1$
+ }
+ }
+
+ final FilterProjectsDialog dialog = new FilterProjectsDialog(shell, providersToProjects);
+ shell.getDisplay().syncExec(new Runnable() {
+
+ public void run() {
+ dialog.open();
+ }
+
+ });
+
+ if (dialog.getReturnCode() == Window.OK) {
+ return dialog.getFilteredProjects();
+ } else {
+ return null;
+ }
+
+ // return providersToProjects;
+ }
+
+ private static List<String> getReferences(Map<String, List<String>> providersToReferences, String provider) {
+ if (!providersToReferences.containsKey(provider)) {
+ providersToReferences.put(provider, new LinkedList<String>());
+ }
+ return providersToReferences.get(provider);
+ }
+
+ private static String getProjectName(ProjectSetCapability serializer, String ref) {
+ String projectName = serializer.getProject(ref);
+ if (projectName == null) {
+ int lastIndex = Math.max(ref.lastIndexOf('/'), Math.max(ref.lastIndexOf(','), ref.lastIndexOf('\\')));
+ if (lastIndex == -1) {
+ return ref;
+ }
+ return ref.substring(lastIndex + 1);
+ }
+
+ return projectName;
+ }
+
+ private static XMLMemento filenameToXMLMemento(String filename) throws InvocationTargetException {
+ InputStreamReader reader = null;
+ try {
+ reader = new InputStreamReader(new FileInputStream(filename), "UTF-8"); //$NON-NLS-1$
+ return XMLMemento.createReadRoot(reader);
+ } catch (UnsupportedEncodingException e) {
+ throw new InvocationTargetException(e);
+ } catch (FileNotFoundException e) {
+ throw new InvocationTargetException(e);
+ } catch (WorkbenchException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ throw new InvocationTargetException(e);
+ }
+ }
+ }
+ }
+
+ private static XMLMemento stringToXMLMemento(String stringContents) throws InvocationTargetException {
+ StringReader reader = null;
+ try {
+ reader = new StringReader(stringContents);
+ return XMLMemento.createReadRoot(reader);
+ } catch (WorkbenchException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ }
+
+ /**
+ * Check if given file is a valid psf file
+ *
+ * @param filename
+ * @return <code>true</code> is file is a valid psf file
+ */
+ public static boolean isValidProjectSetFile(String filename) {
+ try {
+ return filenameToXMLMemento(filename).getString("version") != null; //$NON-NLS-1$
+ } catch (InvocationTargetException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Check if given string is a valid project set
+ *
+ * @param psfContent
+ * @return <code>true</code> if psfContent is a valid project set
+ */
+ public static boolean isValidProjectSetString(String psfContent) {
+ if (psfContent == null) {
+ return false;
+ }
+ try {
+ return stringToXMLMemento(psfContent).getString("version") != null; //$NON-NLS-1$
+ } catch (InvocationTargetException e) {
+ return false;
+ }
+ }
+
+ private static void mergeWorkingSets(IWorkingSet newWs, IWorkingSet oldWs) {
+ IAdaptable[] oldElements = oldWs.getElements();
+ IAdaptable[] newElements = newWs.getElements();
+
+ Set<IAdaptable> combinedElements = new HashSet<IAdaptable>();
+ combinedElements.addAll(Arrays.asList(oldElements));
+ combinedElements.addAll(Arrays.asList(newElements));
+
+ oldWs.setElements(combinedElements.toArray(new IAdaptable[0]));
+ }
+
+ private static void replaceWorkingSet(IWorkingSetManager wsManager, IWorkingSet newWs, IWorkingSet oldWs) {
+ if (oldWs != null) {
+ wsManager.removeWorkingSet(oldWs);
+ }
+ wsManager.addWorkingSet(newWs);
+ }
+
+ private static class AdviceDialog extends MessageDialog {
+
+ boolean applyToAll;
+
+ public AdviceDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, defaultIndex);
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+ final Button checkBox = new Button(parent, SWT.CHECK);
+ checkBox.setText(TeamUIMessages.ImportProjectSetDialog_duplicatedWorkingSet_applyToAll);
+ checkBox.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ applyToAll = checkBox.getSelection();
+ }
+ });
+ return checkBox;
+ }
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/ui/FilterProjectsDialog.java b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/ui/FilterProjectsDialog.java
new file mode 100644
index 00000000000..017404957e7
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.psf/src/org/eclipse/papyrus/infra/psf/ui/FilterProjectsDialog.java
@@ -0,0 +1,270 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.psf.ui;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * A Checkbox Dialog to filter the projects to be imported.
+ *
+ * Note: the projects are represented by their PSF Reference, which is specific for each
+ * team provider. The reference does not necessarily represent a single project
+ * (Although it is the most common case)
+ *
+ * @author Camille Letavernier
+ */
+public class FilterProjectsDialog extends SelectionDialog {
+
+
+
+ public class PSFLabelProvider extends LabelProvider {
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof String) {
+ String ref = (String) element;
+
+ char[] splitStrings = new char[] { '/', ',', '\\' };
+
+ int lastIndex = -1;
+ for (char split : splitStrings) {
+ lastIndex = Math.max(lastIndex, ref.lastIndexOf(split));
+ }
+
+ if (lastIndex == -1) {
+ return ref;
+ }
+ return ref.substring(lastIndex + 1);
+ }
+
+ return super.getText(element);
+ }
+ }
+
+ public class MapContentProvider implements ITreeContentProvider {
+
+ public void dispose() {
+ // Nothing
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ // Nothing
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof Map<?, ?>) {
+ return ((Map<?, ?>) inputElement).keySet().toArray();
+ }
+ return new Object[0];
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof String && providersToProjects.containsKey(parentElement)) {
+ return providersToProjects.get(parentElement).toArray();
+ }
+ return new Object[0];
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return providersToProjects.containsKey(element);
+ }
+
+ }
+
+ private final Map<String, List<String>> providersToProjects;
+
+ private CheckboxTreeViewer treeViewer;
+
+ public FilterProjectsDialog(Shell parentShell, Map<String, List<String>> providersToProjects) {
+ super(parentShell);
+
+ this.providersToProjects = providersToProjects;
+ }
+
+ @Override
+ public void create() {
+ setTitle("Select the projects to import");
+ super.create();
+
+ getShell().setMinimumSize(400, 450);
+ getShell().pack();
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite dialogArea = (Composite) super.createDialogArea(parent);
+ Composite self = new Composite(dialogArea, SWT.CHECK);
+
+ self.setLayout(new GridLayout(1, true));
+ self.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ Label description = new Label(self, SWT.WRAP);
+ description.setText("Select the projects to import");
+ Label warning = new Label(self, SWT.WRAP);
+ warning.setText("Note: Depending on the provider, project names may not be accurate");
+
+ Composite buttonsBar = new Composite(self, SWT.NONE);
+ buttonsBar.setLayoutData(new GridData(SWT.END, SWT.BEGINNING, true, false));
+ buttonsBar.setLayout(new FillLayout());
+
+ Button selectAll = new Button(buttonsBar, SWT.PUSH);
+ selectAll.setText("Select all");
+
+
+ Button unselectAll = new Button(buttonsBar, SWT.PUSH);
+ unselectAll.setText("Unselect all");
+
+
+
+ treeViewer = new CheckboxTreeViewer(self);
+
+ treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ treeViewer.setContentProvider(new MapContentProvider());
+ treeViewer.setLabelProvider(new PSFLabelProvider());
+ treeViewer.setInput(providersToProjects);
+
+ for (String key : providersToProjects.keySet()) {
+ treeViewer.setSubtreeChecked(key, true);
+ }
+
+ // Propagate check to children
+ treeViewer.addCheckStateListener(new ICheckStateListener() {
+
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ treeViewer.setSubtreeChecked(event.getElement(), event.getChecked());
+ computeGrayedRoots();
+ }
+
+ });
+
+ selectAll.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ for (String provider : providersToProjects.keySet()) {
+ treeViewer.setSubtreeChecked(provider, true);
+ computeGrayedRoots();
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // Nothing
+ }
+ });
+
+ unselectAll.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ for (String provider : providersToProjects.keySet()) {
+ treeViewer.setSubtreeChecked(provider, false);
+ computeGrayedRoots();
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // Nothing
+ }
+ });
+
+ return dialogArea;
+ }
+
+ private void computeGrayedRoots() {
+ provider: for (String provider : providersToProjects.keySet()) {
+
+ boolean oneChecked = false;
+
+ boolean oneUnchecked = false;
+
+ for (String project : providersToProjects.get(provider)) {
+ if (treeViewer.getChecked(project)) {
+ oneChecked = true;
+ } else {
+ oneUnchecked = true;
+ }
+
+ if (oneChecked && oneUnchecked) {
+ treeViewer.setGrayChecked(provider, true);
+ continue provider; // Go to the next provider
+ }
+ }
+
+ // We get here only when all projects under this provider have the same state (either checked or unchecked)
+ treeViewer.setChecked(provider, oneChecked);
+ treeViewer.setGrayed(provider, false);
+ }
+ }
+
+ @Override
+ protected void okPressed() {
+ // Remove the unchecked projects/providers
+ Iterator<String> providerIterator = providersToProjects.keySet().iterator();
+ while (providerIterator.hasNext()) {
+ String provider = providerIterator.next();
+ if (!treeViewer.getChecked(provider)) { // Unchecked
+ providerIterator.remove();
+ } else { // Grayed or checked
+ if (treeViewer.getGrayed(provider)) { // Grayed
+ Iterator<String> projectIterator = providersToProjects.get(provider).iterator();
+ while (projectIterator.hasNext()) {
+ String project = projectIterator.next();
+ if (!treeViewer.getChecked(project)) {
+ projectIterator.remove();
+ }
+ }
+ }
+ // Else: checked, do nothing
+ }
+ }
+
+ super.okPressed();
+ }
+
+ @Override
+ protected boolean isResizable() {
+ return true;
+ }
+
+ @Override
+ public boolean isHelpAvailable() {
+ return false;
+ }
+
+ public Map<String, List<String>> getFilteredProjects() {
+ return providersToProjects;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.classpath b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.classpath
new file mode 100755
index 00000000000..098194ca4b7
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.classpath
@@ -0,0 +1,7 @@
+<?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-1.7"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.project b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.project
new file mode 100755
index 00000000000..d7026f45772
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.infra.sync</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.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 00000000000..f08be2b06c4
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,291 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+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_binary_expression=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_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=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_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=0
+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=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+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=true
+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=260
+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=4
+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_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not 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=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not 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_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_binary_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=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_lambda_arrow=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_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_unary_operator=do not 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_binary_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_lambda_arrow=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_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_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=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+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=260
+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=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+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_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.settings/org.eclipse.jdt.ui.prefs b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..954281dbc31
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,68 @@
+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=false
+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=false
+cleanup.format_source_code=false
+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=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=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=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_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_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_Papyrus
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_profile=_Papyrus
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+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\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><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">/**\n * Constructor.\n *\n * ${tags}\n */</template><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">/*****************************************************************************\n * Copyright (c) ${year} CEA LIST and others.\n * \n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * CEA LIST - Initial API and implementation\n * \n *****************************************************************************/\n</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><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">/**\n * ${see_to_overridden}\n *\n * ${tags}\n */</template><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">/**\n * ${see_to_target}\n *\n * ${tags}\n */</template><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}\n${package_declaration}\n\n${typecomment}\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">\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">\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">\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">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" 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}\n// ${todo} Auto-generated constructor stub</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>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/META-INF/MANIFEST.MF b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/META-INF/MANIFEST.MF
new file mode 100755
index 00000000000..2ef109f8360
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.emf.ecore;bundle-version="2.11.0",
+ org.eclipse.emf.transaction;bundle-version="1.8.0",
+ org.eclipse.papyrus.infra.core.log;bundle-version="1.2.0",
+ com.google.guava;bundle-version="11.0.0",
+ org.eclipse.papyrus.infra.core;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.tools;bundle-version="1.2.0",
+ org.eclipse.core.expressions;bundle-version="3.4.600"
+Export-Package: org.eclipse.papyrus.infra.sync,
+ org.eclipse.papyrus.infra.sync.internal;x-internal:=true,
+ org.eclipse.papyrus.infra.sync.policy,
+ org.eclipse.papyrus.infra.sync.service
+Bundle-Vendor: %providerName
+Bundle-ActivationPolicy: lazy
+Bundle-Version: 1.2.0.qualifier
+Bundle-Name: %pluginName
+Bundle-Localization: plugin
+Bundle-ManifestVersion: 2
+Bundle-Activator: org.eclipse.papyrus.infra.sync.Activator
+Bundle-SymbolicName: org.eclipse.papyrus.infra.sync;singleton:=true
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/about.html b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/about.html
new file mode 100644
index 00000000000..d35d5aed64c
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/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/infra/misc/org.eclipse.papyrus.infra.sync/build.properties b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/build.properties
new file mode 100644
index 00000000000..be0cad9dd5e
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/build.properties
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2015 Christian W. Damus 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:
+# Christian W. Damus - initial API and implementation
+#
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.properties,\
+ about.html,\
+ plugin.xml
+src.includes = about.html
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/DeveloperDoc.html b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/DeveloperDoc.html
new file mode 100644
index 00000000000..b3d8a436264
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/DeveloperDoc.html
@@ -0,0 +1,291 @@
+<html>
+<link rel="stylesheet" href="default.css" type="text/css">
+<H1>Generic Model Synchronization Framework</H1>
+<H2 id ="_uf_BAAO4EeW8nIkIujhtCA">Table of Contents</H2>
+<ul><a href="#_ugA2MAO4EeW8nIkIujhtCA">Requirements</a></ul>
+<ul><a href="#_ugHj4AO4EeW8nIkIujhtCA">Use Cases</a><li><a href="#_uhT2sAO4EeW8nIkIujhtCA"> UML-RT Capsule State Machine Diagram Synchronization</a></li>
+<ul><li><a href="#_uhUdwQO4EeW8nIkIujhtCA"> Add elements to general state machine</a></li>
+<ul></ul>
+<li><a href="#_uhYIIQO4EeW8nIkIujhtCA"> Delete elements from general state machine</a></li>
+<ul></ul>
+<li><a href="#_uhbygAO4EeW8nIkIujhtCA"> Lay out elements in general state machine</a></li>
+<ul></ul>
+<li><a href="#_uhe10QO4EeW8nIkIujhtCA"> Hide elements in general state machine</a></li>
+<ul></ul>
+<li><a href="#_uhigMAO4EeW8nIkIujhtCA"> Add elements to special state machine</a></li>
+<ul></ul>
+<li><a href="#_uhljgQO4EeW8nIkIujhtCA"> Lay out elements in special state machine</a></li>
+<ul></ul>
+<li><a href="#_uhpN4QO4EeW8nIkIujhtCA"> Synchronization Lifecycle</a></li>
+<ul></ul>
+</ul>
+</ul>
+<ul><a href="#_uhrqIAO4EeW8nIkIujhtCA">Design</a><li><a href="#_uijz4AO4EeW8nIkIujhtCA"> Component org.eclipse.papyrus.infra.sync</a></li>
+<ul></ul>
+<li><a href="#_uilpEQO4EeW8nIkIujhtCA"> Component org.eclipse.papyrus.infra.gmfdiag.common</a></li>
+<ul></ul>
+<li><a href="#_uioFUAO4EeW8nIkIujhtCA"> Component org.eclipse.papyrus.umlrt.ui</a></li>
+<ul></ul>
+<li><a href="#_uip6gAO4EeW8nIkIujhtCA"> Package org.eclipse.papyrus.infra.sync</a></li>
+<ul><li><a href="#_um5hUAO4EeW8nIkIujhtCA"> Class SyncFeature</a></li>
+<ul></ul>
+<li><a href="#_um7WgQO4EeW8nIkIujhtCA"> Class SyncBucket</a></li>
+<ul></ul>
+<li><a href="#_um9LsQO4EeW8nIkIujhtCA"> Class SyncItem</a></li>
+<ul></ul>
+<li><a href="#_um_n8QO4EeW8nIkIujhtCA"> Class SyncRegistry</a></li>
+<ul></ul>
+<li><a href="#_unBdIQO4EeW8nIkIujhtCA"> Class MasterSlaveSyncBucket</a></li>
+<ul></ul>
+<li><a href="#_unEgcQO4EeW8nIkIujhtCA"> Class EMFListener</a></li>
+<ul></ul>
+<li><a href="#_unGVoQO4EeW8nIkIujhtCA"> Class EMFDispatch</a></li>
+<ul></ul>
+<li><a href="#_unIx4AO4EeW8nIkIujhtCA"> Collaboration Synchronization</a></li>
+<ul><li><a href="#_upSG8QO4EeW8nIkIujhtCA"> Interaction Synchronize Model Elements</a></li>
+<ul></ul>
+</ul>
+</ul>
+<li><a href="#_urPOwQO4EeW8nIkIujhtCA"> Package org.eclipse.papyrus.infra.sync.service</a></li>
+<ul><li><a href="#_uuJY0QO4EeW8nIkIujhtCA"> Interface ISyncService</a></li>
+<ul></ul>
+<li><a href="#_uuLOAQO4EeW8nIkIujhtCA"> Interface ISyncTrigger</a></li>
+<ul></ul>
+<li><a href="#_uuNqQAO4EeW8nIkIujhtCA"> Interface ISyncAction</a></li>
+<ul></ul>
+<li><a href="#_uuPfcQO4EeW8nIkIujhtCA"> Class SyncServiceRunnable</a></li>
+<ul></ul>
+<li><a href="#_uuRUoQO4EeW8nIkIujhtCA"> Class CascadeTriggers</a></li>
+<ul></ul>
+</ul>
+<li><a href="#_uuUX8QO4EeW8nIkIujhtCA"> Package org.eclipse.papyrus.infra.sync.policy</a></li>
+<ul><li><a href="#_uw_RcAO4EeW8nIkIujhtCA"> Interface ISyncPolicy</a></li>
+<ul></ul>
+<li><a href="#_uxBGoQO4EeW8nIkIujhtCA"> Interface ISyncPolicyDelegate</a></li>
+<ul></ul>
+<li><a href="#_uxDi4QO4EeW8nIkIujhtCA"> Class SyncPolicyDelegate</a></li>
+<ul></ul>
+<li><a href="#_uxHNQAO4EeW8nIkIujhtCA"> Class DefaultSyncPolicy</a></li>
+<ul></ul>
+<li><a href="#_uxKQkQO4EeW8nIkIujhtCA"> Interface ISyncPolicyDelegate.Registry</a></li>
+<ul></ul>
+<li><a href="#_uxMFwQO4EeW8nIkIujhtCA"> Collaboration Synchronization Overrides</a></li>
+<ul><li><a href="#_u0EaoQO4EeW8nIkIujhtCA"> Interaction Override Diagram Synchronization</a></li>
+<ul></ul>
+</ul>
+</ul>
+<li><a href="#_u2vUIAO4EeW8nIkIujhtCA"> Package org.eclipse.papyrus.infra.gmfdiag.common.sync</a></li>
+<ul><li><a href="#_u7Hd0QO4EeW8nIkIujhtCA"> Class ContainerChildrenSyncFeature</a></li>
+<ul></ul>
+<li><a href="#_u7KhIQO4EeW8nIkIujhtCA"> Class DiagramEdgesSyncFeature</a></li>
+<ul></ul>
+<li><a href="#_u7NkcAO4EeW8nIkIujhtCA"> Class NodePositionSyncFeature</a></li>
+<ul></ul>
+<li><a href="#_u7QAsQO4EeW8nIkIujhtCA"> Class NodeSizeSyncFeature</a></li>
+<ul></ul>
+<li><a href="#_u7TEAQO4EeW8nIkIujhtCA"> Class EditPartSyncRegistry</a></li>
+<ul></ul>
+<li><a href="#_u7WHUQO4EeW8nIkIujhtCA"> Class EditPartSyncBucket</a></li>
+<ul></ul>
+<li><a href="#_u7ZKoQO4EeW8nIkIujhtCA"> Class EditPartSyncItem</a></li>
+<ul></ul>
+<li><a href="#_u7cN8QO4EeW8nIkIujhtCA"> Collaboration Notation Synchronization</a></li>
+<ul><li><a href="#_u-Bn4QO4EeW8nIkIujhtCA"> Interaction Synchronize Notation Views</a></li>
+<ul></ul>
+</ul>
+<li><a href="#_u_7sYAO4EeW8nIkIujhtCA"> Class NodePositionSyncDispatcher</a></li>
+<ul></ul>
+<li><a href="#_u_-vsQO4EeW8nIkIujhtCA"> Class NodeSizeSyncDispatcher</a></li>
+<ul></ul>
+<li><a href="#_vACaEAO4EeW8nIkIujhtCA"> Collaboration Synchronization Exclusions</a></li>
+<ul><li><a href="#_vCtTkAO4EeW8nIkIujhtCA"> Interaction Exclude Views from Synchronization</a></li>
+<ul></ul>
+</ul>
+<li><a href="#_vE4d0QO4EeW8nIkIujhtCA"> Class NotationSyncPolicyDelegate</a></li>
+<ul></ul>
+</ul>
+</ul>
+<ul><a href="#_vE7hIAO4EeW8nIkIujhtCA">Tests</a><li><a href="#_vFMm4QO4EeW8nIkIujhtCA"> Component org.eclipse.papyrus.infra.gmfdiag.common.tests</a></li>
+<ul></ul>
+<li><a href="#_vFPDIAO4EeW8nIkIujhtCA"> Package org.eclipse.papyrus.infra.gmfdiag.common.sync.tests</a></li>
+<ul><li><a href="#_vG6eIQO4EeW8nIkIujhtCA"> Class MasterSlaveNotationSyncTest</a></li>
+<ul></ul>
+<li><a href="#_vG86YQO4EeW8nIkIujhtCA"> Class NotationSyncOverrideTest</a></li>
+<ul></ul>
+<li><a href="#_vG-vkQO4EeW8nIkIujhtCA"> Class TestSyncFixture</a></li>
+<ul></ul>
+</ul>
+</ul>
+<ul><a href="#_vHBL0AO4EeW8nIkIujhtCA">Requirements Coverage</a></ul>
+<H2 id ="_ugA2MAO4EeW8nIkIujhtCA">Requirements</H2>
+<pre id ="_ugCEUQO4EeW8nIkIujhtCA">- Model-to-Model Sync (id=R1): <BR/> The framework SHALL support the automatic synchronization of model semantics. For example, a state machine in a subclass that redefines a state machine in a superclass must always define regions, vertices, and transitions corresponding to and redefining the regions, vertices, and transitions of the superclass state machine.</pre>
+<pre id ="_ugDScQO4EeW8nIkIujhtCA">- Additional Content (id=R1.1): <BR/> The framework SHALL support the creation of additional elements in the target of a model-to-model synchronization. For example, the state machine of a UML-RT Capsule may add vertices, transitions, and regions in addition to those that are synchronized from (and redefined) the vertices, transitions, and regions of the parent Capsule. Moreover, transitions that redefine transitions in the parent Capsule may be re-targeted to (or re-sourced from) vertices that are added by the redefining state machine.</pre>
+<pre id ="_ugEgkQO4EeW8nIkIujhtCA">- Diagram-to-Diagram Sync (id=R2): <BR/> The framework SHALL support automatic synchronization of the layout of diagrams. For example, a state machine diagram in a subclass that redefines a state machine in a superclass initially presents the same layout as the superclass state machine and changes in the superclass state machine diagram layout are reflected in the subclass.</pre>
+<pre id ="_ugFusAO4EeW8nIkIujhtCA">- Sync Override (id=R2.1): <BR/> Synchronization of diagram layout SHALL be optional. Initially, a diagram is synchronized with the diagram that it redefines, but as needed to effect a sensible layout of the redefining diagram, this synchronization may be broken by the user. The semantics remain synchronized, and some graphical views may remain synchronized, but the user may freely rearrange other views as required by the redefining context.</pre>
+<H2 id ="_ugHj4AO4EeW8nIkIujhtCA">Use Cases</H2>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Use_Cases.png alt=Use Cases ></P><P align="middle">Use Cases</P></BR>
+<H3 id ="_uhT2sAO4EeW8nIkIujhtCA">UML-RT Capsule State Machine Diagram Synchronization</H3>
+<H4 id ="_uhUdwQO4EeW8nIkIujhtCA">Add elements to general state machine</H4>
+<pre id ="_uhWS8AO4EeW8nIkIujhtCA"> - traces to <a href="#_ugCEUQO4EeW8nIkIujhtCA" title="Requirement Model-to-Model Sync">Model-to-Model Sync</a><BR/><BR/> - traces from <a href="#_unIx4AO4EeW8nIkIujhtCA" title="Collaboration Synchronization">Synchronization</a></pre>
+<pre id ="_uhXhEAO4EeW8nIkIujhtCA">The UML-RT model has a Capsule that is specialized by some other Capsule<BR/>that has a state machine redefining the parent Capsule's state machine.<BR/><BR/>When the user adds states, transitions, regions, and other vertices to the<BR/>parent state machine, the system adds corresponding elements to the<BR/>child Capsule's state machine with appropriate redefinition associations.</pre>
+<H4 id ="_uhYIIQO4EeW8nIkIujhtCA">Delete elements from general state machine</H4>
+<pre id ="_uhZ9UAO4EeW8nIkIujhtCA"> - traces to <a href="#_ugCEUQO4EeW8nIkIujhtCA" title="Requirement Model-to-Model Sync">Model-to-Model Sync</a></pre>
+<pre id ="_uhakYQO4EeW8nIkIujhtCA">The UML-RT model has a Capsule that is specialized by some other Capsule<BR/>that has a state machine redefining the parent Capsule's state machine.<BR/><BR/>When the user deletes states, transitions, regions, and other vertices from<BR/>the parent state machine, the system deletes the corresponding redefining<BR/>elements from the child Capsule's state machine.</pre>
+<H4 id ="_uhbygAO4EeW8nIkIujhtCA">Lay out elements in general state machine</H4>
+<pre id ="_uhdAoAO4EeW8nIkIujhtCA"> - traces to <a href="#_ugEgkQO4EeW8nIkIujhtCA" title="Requirement Diagram-to-Diagram Sync">Diagram-to-Diagram Sync</a><BR/><BR/> - traces from <a href="#_u7cN8QO4EeW8nIkIujhtCA" title="Collaboration Notation Synchronization">Notation Synchronization</a></pre>
+<pre id ="_uheOwQO4EeW8nIkIujhtCA">The UML-RT model has a Capsule that is specialized by some other Capsule<BR/>that has a state machine redefining the parent Capsule's state machine.<BR/><BR/>When the user moves and sizes states, regions, and other vertices in the<BR/>parent state machine diagram, the system moves and sizes the<BR/>corresponding redefining elements in the child Capsule's state machine<BR/>diagram to the redefined elements' locations and sizes, respectively.</pre>
+<H4 id ="_uhe10QO4EeW8nIkIujhtCA">Hide elements in general state machine</H4>
+<pre id ="_uhgrAAO4EeW8nIkIujhtCA"> - traces to <a href="#_ugEgkQO4EeW8nIkIujhtCA" title="Requirement Diagram-to-Diagram Sync">Diagram-to-Diagram Sync</a></pre>
+<pre id ="_uhhSEQO4EeW8nIkIujhtCA">The UML-RT model has a Capsule that is specialized by some other Capsule<BR/>that has a state machine redefining the parent Capsule's state machine.<BR/><BR/>When the user hides states, regions, and other vertices from the<BR/>parent state machine diagram (deleting the views but not the model<BR/>elements, themselves), the system removes the views of the<BR/>corresponding redefining elements from the child Capsule's state<BR/>machine diagram.</pre>
+<H4 id ="_uhigMAO4EeW8nIkIujhtCA">Add elements to special state machine</H4>
+<pre id ="_uhjuUAO4EeW8nIkIujhtCA"> - traces to <a href="#_ugDScQO4EeW8nIkIujhtCA" title="Requirement Additional Content">Additional Content</a></pre>
+<pre id ="_uhkVYQO4EeW8nIkIujhtCA">The UML-RT model has a Capsule that is specialized by some other Capsule<BR/>that has a state machine redefining the parent Capsule's state machine.<BR/><BR/>The user adds states, transitions, regions, and other vertices to the child<BR/>Capsule's state machine that are new in this context, not redefining any<BR/>elements from the parent state machine. These may be positioned anywhere<BR/>in the child state machine diagram.<BR/><BR/>Also, transitions that redefine inherited transitions in the parent state machine<BR/>may be re-targeted and/or re-sourced as necessary in the child capsule. This<BR/>includes re-connecting transitions to states and other vertices that exist only<BR/>in the child capsule's state machine (that do not redefine inherited vertices).</pre>
+<H4 id ="_uhljgQO4EeW8nIkIujhtCA">Lay out elements in special state machine</H4>
+<pre id ="_uhnYsAO4EeW8nIkIujhtCA"> - traces to <a href="#_ugFusAO4EeW8nIkIujhtCA" title="Requirement Sync Override">Sync Override</a><BR/><BR/> - traces from <a href="#_uxMFwQO4EeW8nIkIujhtCA" title="Collaboration Synchronization Overrides">Synchronization Overrides</a>, <a href="#_vACaEAO4EeW8nIkIujhtCA" title="Collaboration Synchronization Exclusions">Synchronization Exclusions</a></pre>
+<pre id ="_uhn_wQO4EeW8nIkIujhtCA">The UML-RT model has a Capsule that is specialized by some other Capsule<BR/>that has a state machine redefining the parent Capsule's state machine.<BR/><BR/>When the user deliberately moves and sizes states, regions, and other<BR/>vertices in the child Capsule's state machine diagram, the system detects<BR/>this and exempts the affected views from subsequent synchronization<BR/>of the location and/or size (as appropriate) from the parent state machine<BR/>diagram. Layout changes in the redefined elements in the parent state<BR/>machine diagram are no longer propagated to these views in the child<BR/>state machine diagram.<BR/></pre>
+<H4 id ="_uhpN4QO4EeW8nIkIujhtCA">Synchronization Lifecycle</H4>
+<pre id ="_uhp08QO4EeW8nIkIujhtCA">When an editor is opened, the system initializes synchronization of<BR/>model and diagram content according to the state machine<BR/>synchronization triggers defined by the UML-RT plug-in.<BR/>The synchronization system is destroyed when the editor is closed.</pre>
+<H2 id ="_uhrqIAO4EeW8nIkIujhtCA">Design</H2>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Plug-ins.png alt=Plug-ins ></P><P align="middle">Plug-ins</P></BR>
+<H3 id ="_uijz4AO4EeW8nIkIujhtCA">Component org.eclipse.papyrus.infra.sync</H3>
+<pre id ="_uika8QO4EeW8nIkIujhtCA">The core generic synchronization framework. Provides the base abstractions and<BR/>support for synchronization of EMF-based model elements.</pre>
+<H3 id ="_uilpEQO4EeW8nIkIujhtCA">Component org.eclipse.papyrus.infra.gmfdiag.common</H3>
+<pre id ="_uim3MAO4EeW8nIkIujhtCA">An extension of the synchronization framework that provides support for<BR/>synchronization of GMF-based diagrams as implemented by EditParts.<BR/>Provides specific synchronization features for:<BR/><ul><BR/><li>nested node edit-parts</li><BR/><li>incoming and outgoing connection edit-parts on nodes</li><BR/><li>position of node edit-parts</li><BR/><li>size of node edit-parts</li><BR/></ul></pre>
+<H3 id ="_uioFUAO4EeW8nIkIujhtCA">Component org.eclipse.papyrus.umlrt.ui</H3>
+<pre id ="_uiosYQO4EeW8nIkIujhtCA">Specific implementations of synchronization triggers, registries, buckets, and features for<BR/>semantics of redefining Capsule state machines and visualization of redefining capsule<BR/>state machines in state machine diagrams.</pre>
+<H3 id ="_uip6gAO4EeW8nIkIujhtCA">Package org.eclipse.papyrus.infra.sync</H3>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Framework_Core_Classes.png alt=Sync Framework Core Classes ></P><P align="middle">Sync Framework Core Classes</P></BR>
+<pre id ="_um4TMAO4EeW8nIkIujhtCA">Core abstractions of the synchronization framework, including integration with<BR/>EMF Transactions for synchronization of EMF model elements using trigger<BR/>commands to implement follow-up changes to synchronized objects in reaction<BR/>to changes observed (as Notifications) in source objects.</pre>
+<H4 id ="_um5hUAO4EeW8nIkIujhtCA">Class SyncFeature</H4>
+<pre id ="_um6IYQO4EeW8nIkIujhtCA">A synchronization primitive representing a feature, possibly something<BR/>complex or derived, comprising any number of actual features in EMF<BR/>or Java terms, of the "back-end" object type T that is to be synchronized<BR/>from one or more other objects of the same kind matching the same<BR/>(or equivalent) "front-end" model M, on receipt from the source object<BR/>of some message of type X.</pre>
+<H4 id ="_um7WgQO4EeW8nIkIujhtCA">Class SyncBucket</H4>
+<pre id ="_um8koQO4EeW8nIkIujhtCA">A group of synchronization items that all match different "back-end" objects<BR/>of type T with the same (or logically equivalent; the matching is flexible)<BR/>"front-end" model element of type M. A bucket coordinates synchronization<BR/>of any number of featuers from the back-end of a source item that has<BR/>changed to the back-ends of the other items in the bucket.</pre>
+<H4 id ="_um9LsQO4EeW8nIkIujhtCA">Class SyncItem</H4>
+<pre id ="_um-Z0QO4EeW8nIkIujhtCA">A pairing of a "front-end" model element (of type M) with a "back-end"<BR/>object (of type T) that is synchronized from some other back-end paired<BR/>with the same front-end.</pre>
+<H4 id ="_um_n8QO4EeW8nIkIujhtCA">Class SyncRegistry</H4>
+<pre id ="_unA2EAO4EeW8nIkIujhtCA">A registry of synchronization buckets of the same type. All of the buckets in<BR/>a registry synchronize the same features of the back-ends of type T matching<BR/>front-ends of type M, on receipt of messages of type X. An instance of the<BR/>synchronization service (which is unique in a Papyrus editor) has an unique<BR/>SyncRegistry for every combination of actual front-end, back-end, and message<BR/>types.</pre>
+<H4 id ="_unBdIQO4EeW8nIkIujhtCA">Class MasterSlaveSyncBucket</H4>
+<pre id ="_unCrQQO4EeW8nIkIujhtCA"> - specializes <a href="#_um7WgQO4EeW8nIkIujhtCA" title="Class SyncBucket">SyncBucket</a></pre>
+<pre id ="_unDSUQO4EeW8nIkIujhtCA">A specialized synchronization bucket that implements a master-slave<BR/>synchronization pattern. A single SyncItem is identified as the master<BR/>and its back-end is observed for changes, which are pushed to the<BR/>back-ends of all other SyncItems in the bucket (the slaves).</pre>
+<H4 id ="_unEgcQO4EeW8nIkIujhtCA">Class EMFListener</H4>
+<pre id ="_unFukAO4EeW8nIkIujhtCA">A ResourceSetLIstener on the Papyrus editor's TransactionalEditingDomain<BR/>that observes, via EMFDispatch objects, changes in the "back-end" objects<BR/>of SyncItems in a bucket. When changes are observed, they are dispatched<BR/>to the appropriate SyncFeatures to propagate them (as appropriate) to the<BR/>back-ends of other items in the bucket.</pre>
+<H4 id ="_unGVoQO4EeW8nIkIujhtCA">Class EMFDispatch</H4>
+<pre id ="_unHjwQO4EeW8nIkIujhtCA">A mediator of the propagation of synchronizable feature changes<BR/>from sources to targets when messages are received from the sources<BR/>that trigger synchronization. In the EMF context, these messages are<BR/>Notifications.</pre>
+<H4 id ="_unIx4AO4EeW8nIkIujhtCA">Collaboration Synchronization</H4>
+<pre id ="_unKAAAO4EeW8nIkIujhtCA"> - traces to <a href="#_ugCEUQO4EeW8nIkIujhtCA" title="Requirement Model-to-Model Sync">Model-to-Model Sync</a>, <a href="#_BwcAgP_0EeScYo8tuJyy0A" title="Use Case Add elements to general state machine">Add elements to general state machine</a></pre>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization.png alt=Synchronization ></P><P align="middle">Synchronization</P></BR>
+<H5 id ="_upSG8QO4EeW8nIkIujhtCA">Interaction Synchronize Model Elements</H5>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronize_Model_Elements.png alt=Synchronize Model Elements ></P><P align="middle">Synchronize Model Elements</P></BR>
+<H3 id ="_urPOwQO4EeW8nIkIujhtCA">Package org.eclipse.papyrus.infra.sync.service</H3>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Service_Classes.png alt=Sync Service Classes ></P><P align="middle">Sync Service Classes</P></BR>
+<pre id ="_uuIxwAO4EeW8nIkIujhtCA">A Papyrus registered Service that manages the lifecycle of synchronization,<BR/>including the EMF transaction listener that reacts to changes and the<BR/>application's synchronization triggers and registries.</pre>
+<H4 id ="_uuJY0QO4EeW8nIkIujhtCA">Interface ISyncService</H4>
+<pre id ="_uuKm8QO4EeW8nIkIujhtCA">The synchronization service is a registered Papyrus Service that<BR/>manages model-to-model and diagram-to-diagram synchronization<BR/>within the context of an editor. It manages the EMF transaction<BR/>listener that triggers synchronization operations and it provides the<BR/>API for triggering the configuration of synchronization on objects<BR/>according to registered ISyncTriggers.</pre>
+<H4 id ="_uuLOAQO4EeW8nIkIujhtCA">Interface ISyncTrigger</H4>
+<pre id ="_uuMcIQO4EeW8nIkIujhtCA">Synchronization triggers are registered on an the org.eclipse.papyrus.infra.sync.triggers<BR/>extension point with enablement conditions that match objects on which they should fire. <BR/>When a trigger fires, it provides a sync action that the synchronization runs. This sync<BR/>action is expected to configure synchronization of the triggering object and/or <em>cascade</em><BR/>the trigger to related objects.</pre>
+<H4 id ="_uuNqQAO4EeW8nIkIujhtCA">Interface ISyncAction</H4>
+<pre id ="_uuORUQO4EeW8nIkIujhtCA">An action provided by a synchronization trigger that usually either<BR/>configures synchronization of the triggering object and/or cascade<BR/>the trigger to related objects.</pre>
+<H4 id ="_uuPfcQO4EeW8nIkIujhtCA">Class SyncServiceRunnable</H4>
+<pre id ="_uuQtkAO4EeW8nIkIujhtCA">An executable operation that is run in the context of an ISyncService.</pre>
+<H4 id ="_uuRUoQO4EeW8nIkIujhtCA">Class CascadeTriggers</H4>
+<pre id ="_uuSiwAO4EeW8nIkIujhtCA"> - realizes <a href="#_uuNqQAO4EeW8nIkIujhtCA" title="Interface ISyncAction">ISyncAction</a></pre>
+<pre id ="_uuTJ0QO4EeW8nIkIujhtCA">A synchronization action that cascades the trigger to related objects.<BR/>This causes triggers to be matched on those objects, and any triggers<BR/>that do fire produce further actions that are evaluated to initialize<BR/>synchronization (or induce more triggers).</pre>
+<H3 id ="_uuUX8QO4EeW8nIkIujhtCA">Package org.eclipse.papyrus.infra.sync.policy</H3>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Policy_Classes.png alt=Sync Policy Classes ></P><P align="middle">Sync Policy Classes</P></BR>
+<pre id ="_uw-DUAO4EeW8nIkIujhtCA">API for definition of sync policies providing for synchronization override.</pre>
+<H4 id ="_uw_RcAO4EeW8nIkIujhtCA">Interface ISyncPolicy</H4>
+<pre id ="_uxAfkAO4EeW8nIkIujhtCA">A policy determining whether objects are excluded from synchronization of<BR/>certain features that otherwise would be propagated to them from source objects.</pre>
+<H4 id ="_uxBGoQO4EeW8nIkIujhtCA">Interface ISyncPolicyDelegate</H4>
+<pre id ="_uxCUwQO4EeW8nIkIujhtCA">A synchronization policy delegate for a specific synchronization feature.</pre>
+<H4 id ="_uxDi4QO4EeW8nIkIujhtCA">Class SyncPolicyDelegate</H4>
+<pre id ="_uxExAQO4EeW8nIkIujhtCA"> - realizes <a href="#_uxBGoQO4EeW8nIkIujhtCA" title="Interface ISyncPolicyDelegate">ISyncPolicyDelegate</a></pre>
+<pre id ="_uxF_IQO4EeW8nIkIujhtCA">Abstract implementation of a sync policy delegate for some feature.<BR/>Subclasses are required to determine whether the feature is<BR/>synchronized for some given target object and also to react to<BR/>changes introduced by the user in a target object to disable<BR/>synchronization of the feature (if appropriate).</pre>
+<H4 id ="_uxHNQAO4EeW8nIkIujhtCA">Class DefaultSyncPolicy</H4>
+<pre id ="_uxH0UQO4EeW8nIkIujhtCA"> - realizes <a href="#_uw_RcAO4EeW8nIkIujhtCA" title="Interface ISyncPolicy">ISyncPolicy</a></pre>
+<pre id ="_uxJCcQO4EeW8nIkIujhtCA">Default realization of the ISyncPolicy interface. Clients of the synchronization<BR/>service may install a policy of their own to replace it.<BR/><BR/>This default sync policy delegates policy queries to registered policy delegates.</pre>
+<H4 id ="_uxKQkQO4EeW8nIkIujhtCA">Interface ISyncPolicyDelegate.Registry</H4>
+<pre id ="_uxLesAO4EeW8nIkIujhtCA">A registry of policy delegates by synchronization feature.</pre>
+<H4 id ="_uxMFwQO4EeW8nIkIujhtCA">Collaboration Synchronization Overrides</H4>
+<pre id ="_uxN68AO4EeW8nIkIujhtCA"> - traces to <a href="#__JdhwP_0EeScYo8tuJyy0A" title="Use Case Lay out elements in special state machine">Lay out elements in special state machine</a>, <a href="#_ugDScQO4EeW8nIkIujhtCA" title="Requirement Additional Content">Additional Content</a></pre>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Overrides.png alt=Synchronization Overrides ></P><P align="middle">Synchronization Overrides</P></BR>
+<H5 id ="_u0EaoQO4EeW8nIkIujhtCA">Interaction Override Diagram Synchronization</H5>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Overrides_1.png alt=Synchronization Overrides ></P><P align="middle">Synchronization Overrides</P></BR>
+<H3 id ="_u2vUIAO4EeW8nIkIujhtCA">Package org.eclipse.papyrus.infra.gmfdiag.common.sync</H3>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Notation_Sync_Classes.png alt=Notation Sync Classes ></P><P align="middle">Notation Sync Classes</P></BR>
+<pre id ="_u7GPsQO4EeW8nIkIujhtCA">Implementation of reusable synchronization primitives for GMF-based diagrams.</pre>
+<H4 id ="_u7Hd0QO4EeW8nIkIujhtCA">Class ContainerChildrenSyncFeature</H4>
+<pre id ="_u7Ir8AO4EeW8nIkIujhtCA"> - specializes <a href="#_um5hUAO4EeW8nIkIujhtCA" title="Class SyncFeature">SyncFeature</a></pre>
+<pre id ="_u7JTAQO4EeW8nIkIujhtCA">A specialized SyncFeature that manages synchronization of child<BR/>node EditParts for children of the front-end model element.</pre>
+<H4 id ="_u7KhIQO4EeW8nIkIujhtCA">Class DiagramEdgesSyncFeature</H4>
+<pre id ="_u7LIMQO4EeW8nIkIujhtCA"> - specializes <a href="#_um5hUAO4EeW8nIkIujhtCA" title="Class SyncFeature">SyncFeature</a></pre>
+<pre id ="_u7MWUQO4EeW8nIkIujhtCA">A specialized SyncFeature that manages synchronization of source<BR/>and target connection EditParts for relationships of the front-end<BR/>model element.</pre>
+<H4 id ="_u7NkcAO4EeW8nIkIujhtCA">Class NodePositionSyncFeature</H4>
+<pre id ="_u7OLgQO4EeW8nIkIujhtCA"> - specializes <a href="#_um5hUAO4EeW8nIkIujhtCA" title="Class SyncFeature">SyncFeature</a></pre>
+<pre id ="_u7PZoQO4EeW8nIkIujhtCA">A specialized SyncFeature that manages synchronization of the location<BR/>in the diagram of a node EditPart.</pre>
+<H4 id ="_u7QAsQO4EeW8nIkIujhtCA">Class NodeSizeSyncFeature</H4>
+<pre id ="_u7RO0QO4EeW8nIkIujhtCA"> - specializes <a href="#_um5hUAO4EeW8nIkIujhtCA" title="Class SyncFeature">SyncFeature</a></pre>
+<pre id ="_u7Sc8AO4EeW8nIkIujhtCA">A specialized SyncFeature that manages synchronization of the size<BR/>of a node EditPart.</pre>
+<H4 id ="_u7TEAQO4EeW8nIkIujhtCA">Class EditPartSyncRegistry</H4>
+<pre id ="_u7USIQO4EeW8nIkIujhtCA"> - specializes <a href="#_um_n8QO4EeW8nIkIujhtCA" title="Class SyncRegistry">SyncRegistry</a></pre>
+<pre id ="_u7VgQAO4EeW8nIkIujhtCA">A SyncRegistry that manages SyncBuckets for synchronization of diagram<BR/>EditParts that visualize EObjects in GMF-based diagrams.</pre>
+<H4 id ="_u7WHUQO4EeW8nIkIujhtCA">Class EditPartSyncBucket</H4>
+<pre id ="_u7XVcAO4EeW8nIkIujhtCA"> - specializes <a href="#_um7WgQO4EeW8nIkIujhtCA" title="Class SyncBucket">SyncBucket</a></pre>
+<pre id ="_u7X8gQO4EeW8nIkIujhtCA">A SyncBucket that manages the synchronization of diagram<BR/>EditParts that visualize EObjects in GMF-based diagrams.<BR/>By default, these buckets match edit-parts that all visualize<BR/>the same model element in different diagrams, but this is<BR/>customizable. For example, in the UML-RT case edit-parts<BR/>are matched not with edit-parts visualizing the same model<BR/>element but with edit-parts visualizing the redefined model<BR/>element.</pre>
+<H4 id ="_u7ZKoQO4EeW8nIkIujhtCA">Class EditPartSyncItem</H4>
+<pre id ="_u7aYwAO4EeW8nIkIujhtCA"> - specializes <a href="#_um9LsQO4EeW8nIkIujhtCA" title="Class SyncItem">SyncItem</a></pre>
+<pre id ="_u7a_0QO4EeW8nIkIujhtCA">A SyncItem that manages synchronization of an EditPart<BR/>that visualizes an EObjects in a GMF-based diagram.</pre>
+<H4 id ="_u7cN8QO4EeW8nIkIujhtCA">Collaboration Notation Synchronization</H4>
+<pre id ="_u7dcEAO4EeW8nIkIujhtCA"> - traces to <a href="#_ugEgkQO4EeW8nIkIujhtCA" title="Requirement Diagram-to-Diagram Sync">Diagram-to-Diagram Sync</a>, <a href="#_zJRGUP_0EeScYo8tuJyy0A" title="Use Case Lay out elements in general state machine">Lay out elements in general state machine</a></pre>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Notation_Synchronization.png alt=Notation Synchronization ></P><P align="middle">Notation Synchronization</P></BR>
+<H5 id ="_u-Bn4QO4EeW8nIkIujhtCA">Interaction Synchronize Notation Views</H5>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronize_Model_Elements_1.png alt=Synchronize Model Elements ></P><P align="middle">Synchronize Model Elements</P></BR>
+<H4 id ="_u_7sYAO4EeW8nIkIujhtCA">Class NodePositionSyncDispatcher</H4>
+<pre id ="_u_86gQO4EeW8nIkIujhtCA"> - specializes <a href="#_unGVoQO4EeW8nIkIujhtCA" title="Class EMFDispatch">EMFDispatch</a></pre>
+<pre id ="_u_-IoAO4EeW8nIkIujhtCA">A specialized dispatcher that listens to changes in the bounds of the notation view (Node)<BR/>managed by an EditPart. It tracks the bounds of the shape, firing synchronization only<BR/>when node's position actually changes from the last known position.</pre>
+<H4 id ="_u_-vsQO4EeW8nIkIujhtCA">Class NodeSizeSyncDispatcher</H4>
+<pre id ="_u__90QO4EeW8nIkIujhtCA"> - specializes <a href="#_unGVoQO4EeW8nIkIujhtCA" title="Class EMFDispatch">EMFDispatch</a></pre>
+<pre id ="_vABL8QO4EeW8nIkIujhtCA">A specialized dispatcher that listens to changes in the bounds of the notation view (Node)<BR/>managed by an EditPart. It tracks the bounds of the shape, firing synchronization only<BR/>when node's size actually changes from the last known position.</pre>
+<H4 id ="_vACaEAO4EeW8nIkIujhtCA">Collaboration Synchronization Exclusions</H4>
+<pre id ="_vADoMAO4EeW8nIkIujhtCA"> - traces to <a href="#__JdhwP_0EeScYo8tuJyy0A" title="Use Case Lay out elements in special state machine">Lay out elements in special state machine</a>, <a href="#_ugFusAO4EeW8nIkIujhtCA" title="Requirement Sync Override">Sync Override</a></pre>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Exclusions.png alt=Synchronization Exclusions ></P><P align="middle">Synchronization Exclusions</P></BR>
+<H5 id ="_vCtTkAO4EeW8nIkIujhtCA">Interaction Exclude Views from Synchronization</H5>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Exclude_Views_from_Synchronization.png alt=Exclude Views from Synchronization ></P><P align="middle">Exclude Views from Synchronization</P></BR>
+<H4 id ="_vE4d0QO4EeW8nIkIujhtCA">Class NotationSyncPolicyDelegate</H4>
+<pre id ="_vE5r8QO4EeW8nIkIujhtCA"> - specializes <a href="#_uxDi4QO4EeW8nIkIujhtCA" title="Class SyncPolicyDelegate">SyncPolicyDelegate</a></pre>
+<H2 id ="_vE7hIAO4EeW8nIkIujhtCA">Tests</H2>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Test_Plug-ins.png alt=Test Plug-ins ></P><P align="middle">Test Plug-ins</P></BR>
+<H3 id ="_vFMm4QO4EeW8nIkIujhtCA">Component org.eclipse.papyrus.infra.gmfdiag.common.tests</H3>
+<pre id ="_vFN1AQO4EeW8nIkIujhtCA">Test bundle for the Papyrus common diagram core plug-in.</pre>
+<H3 id ="_vFPDIAO4EeW8nIkIujhtCA">Package org.eclipse.papyrus.infra.gmfdiag.common.sync.tests</H3>
+<P align="middle"><img src=/Users/damus/git/Papyrus/plugins/infra/org.eclipse.papyrus.infra.sync/doc/imgDOC/Test_Classes.png alt=Test Classes ></P><P align="middle">Test Classes</P></BR>
+<pre id ="_vG53EAO4EeW8nIkIujhtCA">Test suite for the synchronization framework, covering both model-to-model<BR/>and diagram-to-diagram synchronization use cases.</pre>
+<H4 id ="_vG6eIQO4EeW8nIkIujhtCA">Class MasterSlaveNotationSyncTest</H4>
+<pre id ="_vG7sQQO4EeW8nIkIujhtCA">Tests the synchronization framework basic synchronization use cases by way<BR/>of master/slave diagram-to-diagram synchronization.</pre>
+<H4 id ="_vG86YQO4EeW8nIkIujhtCA">Class NotationSyncOverrideTest</H4>
+<pre id ="_vG-IgAO4EeW8nIkIujhtCA">Tests the synchronization framework's support for synchronization overrides<BR/>by way of master/slave diagram-to-diagram synchronization.</pre>
+<H4 id ="_vG-vkQO4EeW8nIkIujhtCA">Class TestSyncFixture</H4>
+<pre id ="_vG_9sAO4EeW8nIkIujhtCA">A JUnit test-fixture rule that implements a synchronization registry for class<BR/>diagrams in the context of the test execution.</pre>
+<H2 id ="_vHBL0AO4EeW8nIkIujhtCA">Requirements Coverage</H2>
+<table style="border-collapse: collapse;"><caption style="caption-side: bottom;">RequirementsCoverageTable</caption><tr><th style="border: 1px solid black">Id</th><th style="border: 1px solid black">Satisfied by</th><th style="border: 1px solid black">Verified by</th></tr>
+<tr><td style="border : 1px solid black"><a href="#_ugCEUQO4EeW8nIkIujhtCA" title="Model-to-Model Sync">R1</a><BR/>
+</td><td style="border : 1px solid black"><a href="#_unIx4AO4EeW8nIkIujhtCA" title="Synchronization">Synchronization</a><BR/>
+</td><td style="border : 1px solid black"><a href="#_vG6eIQO4EeW8nIkIujhtCA" title="MasterSlaveNotationSyncTest">MasterSlaveNotationSyncTest</a><BR/>
+</td></tr>
+<tr><td style="border : 1px solid black"><a href="#_ugDScQO4EeW8nIkIujhtCA" title="Additional Content">R1.1</a><BR/>
+</td><td style="border : 1px solid black"><a href="#_uxMFwQO4EeW8nIkIujhtCA" title="Synchronization Overrides">Synchronization Overrides</a><BR/>
+</td><td style="border : 1px solid black"><a href="#_vG6eIQO4EeW8nIkIujhtCA" title="MasterSlaveNotationSyncTest">MasterSlaveNotationSyncTest</a><BR/>
+</td></tr>
+<tr><td style="border : 1px solid black"><a href="#_ugEgkQO4EeW8nIkIujhtCA" title="Diagram-to-Diagram Sync">R2</a><BR/>
+</td><td style="border : 1px solid black"><a href="#_u7cN8QO4EeW8nIkIujhtCA" title="Notation Synchronization">Notation Synchronization</a><BR/>
+</td><td style="border : 1px solid black"><a href="#_vG6eIQO4EeW8nIkIujhtCA" title="MasterSlaveNotationSyncTest">MasterSlaveNotationSyncTest,
+</a><BR/>
+<a href="#_vG86YQO4EeW8nIkIujhtCA" title="NotationSyncOverrideTest">NotationSyncOverrideTest</a><BR/>
+</td></tr>
+<tr><td style="border : 1px solid black"><a href="#_ugFusAO4EeW8nIkIujhtCA" title="Sync Override">R2.1</a><BR/>
+</td><td style="border : 1px solid black"><a href="#_vACaEAO4EeW8nIkIujhtCA" title="Synchronization Exclusions">Synchronization Exclusions</a><BR/>
+</td><td style="border : 1px solid black"><a href="#_vG86YQO4EeW8nIkIujhtCA" title="NotationSyncOverrideTest">NotationSyncOverrideTest</a><BR/>
+</td></tr>
+</table>
+<pre id ="_vHCZ8gO4EeW8nIkIujhtCA">Unsatisfied requirements (0 out of 4) : </pre>
+<pre id ="_vHDoEQO4EeW8nIkIujhtCA">Unverified requirements (0 out of 4) : </pre>
+</html>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/default.css b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/default.css
new file mode 100644
index 00000000000..df978c5d914
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/default.css
@@ -0,0 +1,59 @@
+/*
+ * Style sheet for the CSS2 specification
+ */
+
+body {
+ padding: 2em 1em 2em 70px;
+ margin: 0;
+ font-family: sans-serif;
+ color: black;
+ background: white;
+ background-position: top left;
+ background-attachment: fixed;
+ background-repeat: no-repeat;
+}
+
+
+p {
+ margin-top: 0.6em;
+ margin-bottom: 0.6em;
+ margin-left: 2em;
+}
+
+h1, h2, h3, h4, h5, h6 { text-align: left }
+
+
+h1, h2, h3 { color: #005A9C; background: white }
+h1 { font: 170% sans-serif }
+h2 { font: 140% sans-serif }
+h3 { font: 120% sans-serif }
+h4 { font: bold 100% sans-serif }
+h5 { font: italic 100% sans-serif }
+h6 { font: small-caps 100% sans-serif }
+
+body{counter-reset: h1 h2 h3;}
+
+
+h2:before {
+ content: counter(h2) " ";
+ counter-increment: h2;
+}
+h3:before {
+ content: counter(h2) "." counter(h3) " ";
+ counter-increment: h3;
+}
+h1 {
+ counter-reset: h2;
+}
+h2 {
+ counter-reset: h3;
+}
+h1.unnumbered, h2.unnumbered {
+ counter-reset: none;
+}
+h1.unnumbered:before,
+h2.unnumbered:before,
+h3.unnumbered:before{
+ content: none;
+ counter-increment: none;
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.di b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.di
new file mode 100644
index 00000000000..bf9abab340f
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.di
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"/>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.notation b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.notation
new file mode 100644
index 00000000000..b5fc421544a
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.notation
@@ -0,0 +1,4042 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:configuration="http://www.eclipse.org/papyrus/infra/viewpoints/configuration" xmlns:css="http://www.eclipse.org/papyrus/infra/gmfdiag/css" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:nattable="http://www.eclipse.org/papyrus/nattable/model" xmlns:nattableaxis="http://www.eclipse.org/papyrus/nattable/model/table/nattableaxis" xmlns:nattableaxisconfiguration="http://www.eclipse.org/papyrus/nattable/model/table/nattableaxisconfiguration" xmlns:nattableaxisprovider="http://www.eclipse.org/papyrus/nattable/model/table/nattableaxisprovider" xmlns:nattableconfiguration="http://www.eclipse.org/papyrus/nattable/model/nattableconfiguration" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/papyrus/infra/viewpoints/policy/style" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/papyrus/nattable/model/table/nattableaxis http://www.eclipse.org/papyrus/nattable/model#//nattableaxis http://www.eclipse.org/papyrus/nattable/model/table/nattableaxisconfiguration http://www.eclipse.org/papyrus/nattable/model#//nattableaxisconfiguration http://www.eclipse.org/papyrus/nattable/model/table/nattableaxisprovider http://www.eclipse.org/papyrus/nattable/model#//nattableaxisprovider http://www.eclipse.org/papyrus/nattable/model/nattableconfiguration http://www.eclipse.org/papyrus/nattable/model#//nattableconfiguration">
+ <notation:Diagram xmi:id="_y3prQACLEeWudc8agGQ04Q" type="PapyrusUMLClassDiagram" name="Overview" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_y3prQQCLEeWudc8agGQ04Q" type="2005">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_jbVU8ACQEeWudc8agGQ04Q" source="PapyrusHyperLink_Page" references="_Yn6OoACQEeWudc8agGQ04Q">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_jbVU8QCQEeWudc8agGQ04Q" key="tooltip_text" value="Requirements"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_jbVU8gCQEeWudc8agGQ04Q" key="pageName" value="Requirements"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_jbVU8wCQEeWudc8agGQ04Q" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prQgCLEeWudc8agGQ04Q" type="5020"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prQwCLEeWudc8agGQ04Q" type="7009">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_y3prRACLEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_y3prRQCLEeWudc8agGQ04Q"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4qH0oACVEeWudc8agGQ04Q" visible="false" type="StereotypeLabel">
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_4qH0oQCVEeWudc8agGQ04Q" name="stereotype" stringValue="DeveloperProcess::structure::Requirements"/>
+ <element xmi:type="uml:Stereotype" href="pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_ZnEXUMbYEeO09JBvNFZRNw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4qH0ogCVEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:Model" href="design.uml#_y3pEMgCLEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_y3prRgCLEeWudc8agGQ04Q" x="201" y="17"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_y3prRwCLEeWudc8agGQ04Q" type="2005">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_qZD8EACQEeWudc8agGQ04Q" source="PapyrusHyperLink_Page" references="_s1YfcACOEeWudc8agGQ04Q">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_qZD8EQCQEeWudc8agGQ04Q" key="tooltip_text" value="Use Cases"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_qZD8EgCQEeWudc8agGQ04Q" key="pageName" value="Use Cases"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_qZD8EwCQEeWudc8agGQ04Q" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prSACLEeWudc8agGQ04Q" type="5020"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prSQCLEeWudc8agGQ04Q" type="7009">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_y3prSgCLEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_y3prSwCLEeWudc8agGQ04Q"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4qOiUACVEeWudc8agGQ04Q" visible="false" type="StereotypeLabel">
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_4qOiUQCVEeWudc8agGQ04Q" name="stereotype" stringValue="DeveloperProcess::structure::UseCases"/>
+ <element xmi:type="uml:Stereotype" href="pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_cvzC0MbYEeO09JBvNFZRNw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4qOiUgCVEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:Model" href="design.uml#_y3pEMwCLEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_y3prTACLEeWudc8agGQ04Q" x="204" y="173"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_y3prTQCLEeWudc8agGQ04Q" type="2005">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_vPKh0ACwEeWnE_cMzyyIKA" source="PapyrusHyperLink_Page" references="_G7-rgACoEeWnE_cMzyyIKA">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_vPKh0QCwEeWnE_cMzyyIKA" key="tooltip_text" value="Plug-ins"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_vPKh0gCwEeWnE_cMzyyIKA" key="pageName" value="Plug-ins"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_vPKh0wCwEeWnE_cMzyyIKA" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prTgCLEeWudc8agGQ04Q" type="5020"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prTwCLEeWudc8agGQ04Q" type="7009">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_y3prUACLEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_y3prUQCLEeWudc8agGQ04Q"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4qV3EACVEeWudc8agGQ04Q" visible="false" type="StereotypeLabel">
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_4qV3EQCVEeWudc8agGQ04Q" name="stereotype" stringValue="DeveloperProcess::structure::Design"/>
+ <element xmi:type="uml:Stereotype" href="pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_bS3x0MbYEeO09JBvNFZRNw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4qV3EgCVEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:Model" href="design.uml#_y3pENgCLEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_y3prUgCLEeWudc8agGQ04Q" x="206" y="329"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_y3prUwCLEeWudc8agGQ04Q" type="2005">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_ZXwcwAM5EeWWbMjTqzYc1A" source="PapyrusHyperLink_Page" references="_aCgfYAM4EeWWbMjTqzYc1A">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_ZXwcwQM5EeWWbMjTqzYc1A" key="tooltip_text" value="Test Plug-ins"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_ZXwcwgM5EeWWbMjTqzYc1A" key="pageName" value="Test Plug-ins"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_ZXwcwwM5EeWWbMjTqzYc1A" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prVACLEeWudc8agGQ04Q" type="5020"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prVQCLEeWudc8agGQ04Q" type="7009">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_y3prVgCLEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_y3prVwCLEeWudc8agGQ04Q"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4qckwACVEeWudc8agGQ04Q" visible="false" type="StereotypeLabel">
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_4qckwQCVEeWudc8agGQ04Q" name="stereotype" stringValue="DeveloperProcess::structure::Tests"/>
+ <element xmi:type="uml:Stereotype" href="pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_f1LfYMbYEeO09JBvNFZRNw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4qckwgCVEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:Model" href="design.uml#_y3pEOACLEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_y3prWACLEeWudc8agGQ04Q" x="553" y="328"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_hWJRcACNEeWudc8agGQ04Q" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hWJRcQCNEeWudc8agGQ04Q" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_hWJRcwCNEeWudc8agGQ04Q" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Model" href="design.uml#_y3pEMgCLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hWJRcgCNEeWudc8agGQ04Q" x="401" y="38"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_hWTCcACNEeWudc8agGQ04Q" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hWTCcQCNEeWudc8agGQ04Q" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_hWTCcwCNEeWudc8agGQ04Q" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Model" href="design.uml#_y3pEMwCLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hWTCcgCNEeWudc8agGQ04Q" x="404" y="173"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_hWdagACNEeWudc8agGQ04Q" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hWdagQCNEeWudc8agGQ04Q" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_hWdagwCNEeWudc8agGQ04Q" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Model" href="design.uml#_y3pENgCLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hWdaggCNEeWudc8agGQ04Q" x="406" y="329"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_hWoZoACNEeWudc8agGQ04Q" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hWoZoQCNEeWudc8agGQ04Q" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_hWoZowCNEeWudc8agGQ04Q" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Model" href="design.uml#_y3pEOACLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hWoZogCNEeWudc8agGQ04Q" x="835" y="324"/>
+ </children>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_y3prWQCLEeWudc8agGQ04Q"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_y3prWgCLEeWudc8agGQ04Q">
+ <owner xmi:type="uml:Model" href="design.uml#_y3pEMACLEeWudc8agGQ04Q"/>
+ <configuration xmi:type="configuration:PapyrusDiagram" href="platform:/plugin/org.eclipse.papyrus.infra.viewpoints.policy/builtin/default.configuration#_7wLmpNxhEeOqHvRyiN87hA"/>
+ </styles>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_hVLBEACNEeWudc8agGQ04Q" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <element xmi:type="uml:Model" href="design.uml#_y3pEMACLEeWudc8agGQ04Q"/>
+ <edges xmi:type="notation:Connector" xmi:id="_y3prWwCLEeWudc8agGQ04Q" type="4006" source="_y3prRwCLEeWudc8agGQ04Q" target="_y3prQQCLEeWudc8agGQ04Q">
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prXACLEeWudc8agGQ04Q" type="6014">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_HcN-swCQEeWudc8agGQ04Q" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_HcN-tACQEeWudc8agGQ04Q" key="visible" value="true"/>
+ </eAnnotations>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_y3prXQCLEeWudc8agGQ04Q" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prXgCLEeWudc8agGQ04Q" visible="false" type="6015">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_HcNXoACQEeWudc8agGQ04Q" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_HcNXoQCQEeWudc8agGQ04Q" key="visible" value="true"/>
+ </eAnnotations>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_y3prXwCLEeWudc8agGQ04Q" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_y3prYACLEeWudc8agGQ04Q"/>
+ <element xmi:type="uml:Abstraction" href="design.uml#_y3pENACLEeWudc8agGQ04Q"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_y3prYQCLEeWudc8agGQ04Q" points="[-2, -10, 8, 48]$[-27, -45, -17, 13]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_y3prYgCLEeWudc8agGQ04Q" id="(0.295,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_y3prYwCLEeWudc8agGQ04Q" id="(0.31,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_y3prZACLEeWudc8agGQ04Q" type="4006" source="_y3prTQCLEeWudc8agGQ04Q" target="_y3prRwCLEeWudc8agGQ04Q">
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prZQCLEeWudc8agGQ04Q" type="6014">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_HcMwkACQEeWudc8agGQ04Q" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_HcMwkQCQEeWudc8agGQ04Q" key="visible" value="true"/>
+ </eAnnotations>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_y3prZgCLEeWudc8agGQ04Q" x="-6" y="32"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prZwCLEeWudc8agGQ04Q" visible="false" type="6015">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_HcNXpACQEeWudc8agGQ04Q" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_HcNXpQCQEeWudc8agGQ04Q" key="visible" value="true"/>
+ </eAnnotations>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_y3praACLEeWudc8agGQ04Q" x="-2" y="-48"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_y3praQCLEeWudc8agGQ04Q"/>
+ <element xmi:type="uml:Abstraction" href="design.uml#_y3pENwCLEeWudc8agGQ04Q"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_y3pragCLEeWudc8agGQ04Q" points="[-9, -16, 0, 67]$[-24, -72, -15, 11]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_y3prawCLEeWudc8agGQ04Q" id="(0.27,0.16)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_y3prbACLEeWudc8agGQ04Q" id="(0.235,0.89)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_y3prbQCLEeWudc8agGQ04Q" type="4008" source="_y3prUwCLEeWudc8agGQ04Q" target="_y3prRwCLEeWudc8agGQ04Q">
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prbgCLEeWudc8agGQ04Q" type="6026">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_HcNXpgCQEeWudc8agGQ04Q" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_HcN-sACQEeWudc8agGQ04Q" key="visible" value="true"/>
+ </eAnnotations>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_y3prbwCLEeWudc8agGQ04Q" x="1" y="23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prcACLEeWudc8agGQ04Q" visible="false" type="6027">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_HcN-tQCQEeWudc8agGQ04Q" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_HcN-tgCQEeWudc8agGQ04Q" key="visible" value="true"/>
+ </eAnnotations>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_y3prcQCLEeWudc8agGQ04Q" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_y3prcgCLEeWudc8agGQ04Q"/>
+ <element xmi:type="uml:Dependency" href="design.uml#_y3pEOQCLEeWudc8agGQ04Q"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_y3prcwCLEeWudc8agGQ04Q" points="[-46, -20, 265, 113]$[-275, -135, 36, -2]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_y3prdACLEeWudc8agGQ04Q" id="(0.0,0.24)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_y3prdQCLEeWudc8agGQ04Q" id="(1.0,0.65)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_y3prdgCLEeWudc8agGQ04Q" type="4008" source="_y3prUwCLEeWudc8agGQ04Q" target="_y3prTQCLEeWudc8agGQ04Q">
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3prdwCLEeWudc8agGQ04Q" type="6026">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_HcN-sQCQEeWudc8agGQ04Q" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_HcN-sgCQEeWudc8agGQ04Q" key="visible" value="true"/>
+ </eAnnotations>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_y3preACLEeWudc8agGQ04Q" x="1" y="18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_y3preQCLEeWudc8agGQ04Q" visible="false" type="6027">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_HcNXogCQEeWudc8agGQ04Q" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_HcNXowCQEeWudc8agGQ04Q" key="visible" value="true"/>
+ </eAnnotations>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_y3pregCLEeWudc8agGQ04Q" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_y3prewCLEeWudc8agGQ04Q"/>
+ <element xmi:type="uml:Dependency" href="design.uml#_y3pEOgCLEeWudc8agGQ04Q"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_y3prfACLEeWudc8agGQ04Q" points="[-40, 1, 262, -12]$[-267, 20, 35, 7]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_y3prfQCLEeWudc8agGQ04Q" id="(0.0,0.65)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_y3prfgCLEeWudc8agGQ04Q" id="(1.0,0.64)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_hWJRdACNEeWudc8agGQ04Q" type="StereotypeCommentLink" source="_y3prQQCLEeWudc8agGQ04Q" target="_hWJRcACNEeWudc8agGQ04Q">
+ <styles xmi:type="notation:FontStyle" xmi:id="_hWJRdQCNEeWudc8agGQ04Q"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_hWJ4gACNEeWudc8agGQ04Q" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Model" href="design.uml#_y3pEMgCLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_hWJRdgCNEeWudc8agGQ04Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hWJRdwCNEeWudc8agGQ04Q"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hWJReACNEeWudc8agGQ04Q"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_hWTCdACNEeWudc8agGQ04Q" type="StereotypeCommentLink" source="_y3prRwCLEeWudc8agGQ04Q" target="_hWTCcACNEeWudc8agGQ04Q">
+ <styles xmi:type="notation:FontStyle" xmi:id="_hWTCdQCNEeWudc8agGQ04Q"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_hWTCeQCNEeWudc8agGQ04Q" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Model" href="design.uml#_y3pEMwCLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_hWTCdgCNEeWudc8agGQ04Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hWTCdwCNEeWudc8agGQ04Q"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hWTCeACNEeWudc8agGQ04Q"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_hWdahACNEeWudc8agGQ04Q" type="StereotypeCommentLink" source="_y3prTQCLEeWudc8agGQ04Q" target="_hWdagACNEeWudc8agGQ04Q">
+ <styles xmi:type="notation:FontStyle" xmi:id="_hWdahQCNEeWudc8agGQ04Q"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_hWeBkgCNEeWudc8agGQ04Q" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Model" href="design.uml#_y3pENgCLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_hWdahgCNEeWudc8agGQ04Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hWeBkACNEeWudc8agGQ04Q"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hWeBkQCNEeWudc8agGQ04Q"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_hWoZpACNEeWudc8agGQ04Q" type="StereotypeCommentLink" source="_y3prUwCLEeWudc8agGQ04Q" target="_hWoZoACNEeWudc8agGQ04Q">
+ <styles xmi:type="notation:FontStyle" xmi:id="_hWoZpQCNEeWudc8agGQ04Q"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_hWpAsACNEeWudc8agGQ04Q" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Model" href="design.uml#_y3pEOACLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_hWoZpgCNEeWudc8agGQ04Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hWoZpwCNEeWudc8agGQ04Q"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hWoZqACNEeWudc8agGQ04Q"/>
+ </edges>
+ </notation:Diagram>
+ <css:ModelStyleSheets xmi:id="_kFsLcACOEeWudc8agGQ04Q"/>
+ <notation:Diagram xmi:id="_s1YfcACOEeWudc8agGQ04Q" type="UseCase" name="Use Cases" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_vQlWkACOEeWudc8agGQ04Q" type="2015">
+ <children xmi:type="notation:DecorationNode" xmi:id="_vQlWkgCOEeWudc8agGQ04Q" type="5019"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_vQlWkwCOEeWudc8agGQ04Q" type="6047">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vQlWlACOEeWudc8agGQ04Q" y="5"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_vQlWlQCOEeWudc8agGQ04Q" type="7011">
+ <children xmi:type="notation:Shape" xmi:id="_6GrWYACOEeWudc8agGQ04Q" type="3009">
+ <children xmi:type="notation:DecorationNode" xmi:id="_6Gr9cACOEeWudc8agGQ04Q" type="5018"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6Gr9cQCOEeWudc8agGQ04Q" type="6045">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6Gr9cgCOEeWudc8agGQ04Q" y="5"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6Gr9cwCOEeWudc8agGQ04Q" type="7012">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6Gr9dACOEeWudc8agGQ04Q"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6Gr9dQCOEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6Gr9dgCOEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:UseCase" href="design.uml#_BwcAgP_0EeScYo8tuJyy0A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6GrWYQCOEeWudc8agGQ04Q" x="24" y="11"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_6nbTAACOEeWudc8agGQ04Q" type="3009">
+ <children xmi:type="notation:DecorationNode" xmi:id="_6nbTAgCOEeWudc8agGQ04Q" type="5018"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6nbTAwCOEeWudc8agGQ04Q" type="6045">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6nbTBACOEeWudc8agGQ04Q" y="5"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6nb6EACOEeWudc8agGQ04Q" type="7012">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6nb6EQCOEeWudc8agGQ04Q"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6nb6EgCOEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6nb6EwCOEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:UseCase" href="design.uml#_xdObQP_0EeScYo8tuJyy0A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6nbTAQCOEeWudc8agGQ04Q" x="136" y="93"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_-SDKoACOEeWudc8agGQ04Q" type="3009">
+ <children xmi:type="notation:DecorationNode" xmi:id="_-SDxsACOEeWudc8agGQ04Q" type="5018"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-SDxsQCOEeWudc8agGQ04Q" type="6045">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-SDxsgCOEeWudc8agGQ04Q" y="5"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-SDxswCOEeWudc8agGQ04Q" type="7012">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_-SDxtACOEeWudc8agGQ04Q"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_-SDxtQCOEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-SDxtgCOEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:UseCase" href="design.uml#_zJRGUP_0EeScYo8tuJyy0A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-SDKoQCOEeWudc8agGQ04Q" x="74" y="173"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_-83CMACOEeWudc8agGQ04Q" type="3009">
+ <children xmi:type="notation:DecorationNode" xmi:id="_-83CMgCOEeWudc8agGQ04Q" type="5018"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-83CMwCOEeWudc8agGQ04Q" type="6045">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-83CNACOEeWudc8agGQ04Q" y="5"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-83CNQCOEeWudc8agGQ04Q" type="7012">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_-83CNgCOEeWudc8agGQ04Q"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_-83CNwCOEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-83COACOEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:UseCase" href="design.uml#_226cwP_0EeScYo8tuJyy0A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-83CMQCOEeWudc8agGQ04Q" x="180" y="268"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__hbu4ACOEeWudc8agGQ04Q" type="3009">
+ <children xmi:type="notation:DecorationNode" xmi:id="__hcV8ACOEeWudc8agGQ04Q" type="5018"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="__hcV8QCOEeWudc8agGQ04Q" type="6045">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__hcV8gCOEeWudc8agGQ04Q" y="5"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="__hcV8wCOEeWudc8agGQ04Q" type="7012">
+ <styles xmi:type="notation:SortingStyle" xmi:id="__hcV9ACOEeWudc8agGQ04Q"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__hcV9QCOEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__hcV9gCOEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:UseCase" href="design.uml#_5w1QMP_0EeScYo8tuJyy0A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__hbu4QCOEeWudc8agGQ04Q" x="193" y="345"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_AAIdEACPEeWudc8agGQ04Q" type="3009">
+ <children xmi:type="notation:DecorationNode" xmi:id="_AAIdEgCPEeWudc8agGQ04Q" type="5018"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_AAIdEwCPEeWudc8agGQ04Q" type="6045">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_AAIdFACPEeWudc8agGQ04Q" y="5"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_AAIdFQCPEeWudc8agGQ04Q" type="7012">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_AAIdFgCPEeWudc8agGQ04Q"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_AAIdFwCPEeWudc8agGQ04Q"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_AAIdGACPEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:UseCase" href="design.uml#__JdhwP_0EeScYo8tuJyy0A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_AAIdEQCPEeWudc8agGQ04Q" x="26" y="395"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_J0SmUACxEeWnE_cMzyyIKA" type="3009">
+ <children xmi:type="notation:DecorationNode" xmi:id="_J0T0cACxEeWnE_cMzyyIKA" type="5018"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_J0T0cQCxEeWnE_cMzyyIKA" type="6045">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_J0T0cgCxEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_J0T0cwCxEeWnE_cMzyyIKA" type="7012">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_J0T0dACxEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_J0T0dQCxEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_J0T0dgCxEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:UseCase" href="design.uml#_J0AScACxEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_J0SmUQCxEeWnE_cMzyyIKA" x="163" y="478"/>
+ </children>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vQlWlgCOEeWudc8agGQ04Q"/>
+ </children>
+ <element xmi:type="uml:Component" href="design.uml#_xS4T0P_xEeScYo8tuJyy0A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vQlWkQCOEeWudc8agGQ04Q" x="254" y="27" height="578"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_DHi58ACPEeWudc8agGQ04Q" type="2011">
+ <children xmi:type="notation:DecorationNode" xmi:id="_DHi58gCPEeWudc8agGQ04Q" type="5014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_DHi58wCPEeWudc8agGQ04Q" x="20" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_DHi59ACPEeWudc8agGQ04Q" type="6029">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_DHi59QCPEeWudc8agGQ04Q" x="20" y="100"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_DHi59gCPEeWudc8agGQ04Q" type="6037">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_DHi59wCPEeWudc8agGQ04Q" x="20" y="80"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_DHjhAACPEeWudc8agGQ04Q" type="6048">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_DHjhAQCPEeWudc8agGQ04Q" y="5"/>
+ </children>
+ <element xmi:type="uml:Actor" href="design.uml#_B0KNcP_1EeScYo8tuJyy0A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DHi58QCPEeWudc8agGQ04Q" x="79" y="267"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_UoiMAACxEeWnE_cMzyyIKA" type="2011">
+ <children xmi:type="notation:DecorationNode" xmi:id="_UoizEACxEeWnE_cMzyyIKA" type="5014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_UoizEQCxEeWnE_cMzyyIKA" x="20" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_UoizEgCxEeWnE_cMzyyIKA" type="6029">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_UoizEwCxEeWnE_cMzyyIKA" x="20" y="100"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_UoizFACxEeWnE_cMzyyIKA" type="6037">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_UoizFQCxEeWnE_cMzyyIKA" x="20" y="80"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_UoizFgCxEeWnE_cMzyyIKA" type="6048">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_UoizFwCxEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <element xmi:type="uml:Actor" href="design.uml#_UobeUACxEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UoiMAQCxEeWnE_cMzyyIKA" x="706" y="461"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_s1YfcQCOEeWudc8agGQ04Q" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_s1YfcgCOEeWudc8agGQ04Q"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_s1YfcwCOEeWudc8agGQ04Q">
+ <owner xmi:type="uml:Model" href="design.uml#_y3pEMwCLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xmi:type="uml:Model" href="design.uml#_y3pEMwCLEeWudc8agGQ04Q"/>
+ <edges xmi:type="notation:Connector" xmi:id="_FNONAACPEeWudc8agGQ04Q" type="4011" source="_DHi58ACPEeWudc8agGQ04Q" target="_6GrWYACOEeWudc8agGQ04Q">
+ <children xmi:type="notation:DecorationNode" xmi:id="_FNONAwCPEeWudc8agGQ04Q" type="6008">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FNONBACPEeWudc8agGQ04Q" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FNO0EACPEeWudc8agGQ04Q" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FNO0EQCPEeWudc8agGQ04Q" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_FNONAQCPEeWudc8agGQ04Q"/>
+ <element xmi:type="uml:Association" href="design.uml#_C7VQ4P_1EeScYo8tuJyy0A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_FNONAgCPEeWudc8agGQ04Q" points="[15, -11, -271, 187]$[246, -171, -40, 27]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_FNddkACPEeWudc8agGQ04Q" type="4011" source="_DHi58ACPEeWudc8agGQ04Q" target="_6nbTAACOEeWudc8agGQ04Q">
+ <children xmi:type="notation:DecorationNode" xmi:id="_FNddkwCPEeWudc8agGQ04Q" type="6008">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FNddlACPEeWudc8agGQ04Q" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FNddlQCPEeWudc8agGQ04Q" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FNddlgCPEeWudc8agGQ04Q" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_FNddkQCPEeWudc8agGQ04Q"/>
+ <element xmi:type="uml:Association" href="design.uml#_EvogEP_1EeScYo8tuJyy0A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_FNddkgCPEeWudc8agGQ04Q" points="[15, -5, -394, 111]$[333, -95, -76, 21]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_FNtVMACPEeWudc8agGQ04Q" type="4011" source="_DHi58ACPEeWudc8agGQ04Q" target="_-SDKoACOEeWudc8agGQ04Q">
+ <children xmi:type="notation:DecorationNode" xmi:id="_FNt8QACPEeWudc8agGQ04Q" type="6008">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FNt8QQCPEeWudc8agGQ04Q" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FNt8QgCPEeWudc8agGQ04Q" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FNt8QwCPEeWudc8agGQ04Q" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_FNtVMQCPEeWudc8agGQ04Q"/>
+ <element xmi:type="uml:Association" href="design.uml#_FkGp8P_1EeScYo8tuJyy0A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_FNtVMgCPEeWudc8agGQ04Q" points="[15, -2, -328, 34]$[245, -26, -98, 10]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_FN-a8ACPEeWudc8agGQ04Q" type="4011" source="_DHi58ACPEeWudc8agGQ04Q" target="_-83CMACOEeWudc8agGQ04Q">
+ <children xmi:type="notation:DecorationNode" xmi:id="_FN-a8wCPEeWudc8agGQ04Q" type="6008">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FN-a9ACPEeWudc8agGQ04Q" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FN-a9QCPEeWudc8agGQ04Q" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FN-a9gCPEeWudc8agGQ04Q" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_FN-a8QCPEeWudc8agGQ04Q"/>
+ <element xmi:type="uml:Association" href="design.uml#_GJo_8P_1EeScYo8tuJyy0A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_FN-a8gCPEeWudc8agGQ04Q" points="[15, 1, -428, -58]$[353, 47, -90, -12]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_FORV4ACPEeWudc8agGQ04Q" type="4011" source="_DHi58ACPEeWudc8agGQ04Q" target="__hbu4ACOEeWudc8agGQ04Q">
+ <children xmi:type="notation:DecorationNode" xmi:id="_FORV4wCPEeWudc8agGQ04Q" type="6008">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FORV5ACPEeWudc8agGQ04Q" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FORV5QCPEeWudc8agGQ04Q" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FORV5gCPEeWudc8agGQ04Q" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_FORV4QCPEeWudc8agGQ04Q"/>
+ <element xmi:type="uml:Association" href="design.uml#_GuxtUP_1EeScYo8tuJyy0A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_FORV4gCPEeWudc8agGQ04Q" points="[15, 4, -439, -132]$[384, 115, -70, -21]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_FOiboACPEeWudc8agGQ04Q" type="4011" source="_DHi58ACPEeWudc8agGQ04Q" target="_AAIdEACPEeWudc8agGQ04Q">
+ <children xmi:type="notation:DecorationNode" xmi:id="_FOibowCPEeWudc8agGQ04Q" type="6008">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FOibpACPEeWudc8agGQ04Q" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FOibpQCPEeWudc8agGQ04Q" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FOibpgCPEeWudc8agGQ04Q" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_FOiboQCPEeWudc8agGQ04Q"/>
+ <element xmi:type="uml:Association" href="design.uml#_HgO_cP_1EeScYo8tuJyy0A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_FOibogCPEeWudc8agGQ04Q" points="[15, 9, -279, -177]$[251, 158, -43, -28]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_mRAekACxEeWnE_cMzyyIKA" type="4011" source="_UoiMAACxEeWnE_cMzyyIKA" target="_J0SmUACxEeWnE_cMzyyIKA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_mRAekwCxEeWnE_cMzyyIKA" type="6008">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_mRAelACxEeWnE_cMzyyIKA" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_mRBFoACxEeWnE_cMzyyIKA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_mRBFoQCxEeWnE_cMzyyIKA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_mRAekQCxEeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Association" href="design.uml#_mQ37sACxEeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mRAekgCxEeWnE_cMzyyIKA" points="[-15, 5, 160, -64]$[-159, 75, 16, 6]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mRveYACxEeWnE_cMzyyIKA" id="(0.0,0.64)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mRveYQCxEeWnE_cMzyyIKA" id="(1.0,0.2833333333333333)"/>
+ </edges>
+ </notation:Diagram>
+ <nattable:Table xmi:id="_Yn6OoACQEeWudc8agGQ04Q" name="Requirements" currentRowAxisProvider="_Yn6OpQCQEeWudc8agGQ04Q" currentColumnAxisProvider="_Yn6OoQCQEeWudc8agGQ04Q">
+ <context xmi:type="uml:Model" href="design.uml#_y3pEMgCLEeWudc8agGQ04Q"/>
+ <owner xmi:type="uml:Model" href="design.uml#_y3pEMgCLEeWudc8agGQ04Q"/>
+ <prototype xmi:type="configuration:PapyrusSyncTable" href="platform:/plugin/org.eclipse.papyrus.infra.viewpoints.policy/builtin/default.configuration#_7wNb3txhEeOqHvRyiN87hA"/>
+ <tableConfiguration xmi:type="nattableconfiguration:TableConfiguration" href="platform:/plugin/org.eclipse.papyrus.sysml.nattable.requirement.config/configs/requirement.nattableconfiguration#/"/>
+ <columnAxisProvidersHistory xmi:type="nattableaxisprovider:SlaveObjectAxisProvider" xmi:id="_Yn6OoQCQEeWudc8agGQ04Q" description="Provides the columns of the tables with a default configuration" name="Requirements Feature Columns Provider">
+ <axis xmi:type="nattableaxis:FeatureIdAxis" xmi:id="_Yn6OogCQEeWudc8agGQ04Q" element="property_of_stereotype:/SysML::Requirements::Requirement::id">
+ <manager xmi:type="nattableaxisconfiguration:AxisManagerRepresentation" href="platform:/plugin/org.eclipse.papyrus.sysml.nattable.requirement.config/configs/requirement.nattableconfiguration#//@columnHeaderAxisConfiguration/@axisManagers.1"/>
+ </axis>
+ <axis xmi:type="nattableaxis:EStructuralFeatureAxis" xmi:id="_Yn6OowCQEeWudc8agGQ04Q">
+ <manager xmi:type="nattableaxisconfiguration:AxisManagerRepresentation" href="platform:/plugin/org.eclipse.papyrus.sysml.nattable.requirement.config/configs/requirement.nattableconfiguration#//@columnHeaderAxisConfiguration/@axisManagers.0"/>
+ <element xmi:type="ecore:EAttribute" href="http://www.eclipse.org/uml2/5.0.0/UML#//NamedElement/name"/>
+ </axis>
+ <axis xmi:type="nattableaxis:FeatureIdAxis" xmi:id="_Yn6OpACQEeWudc8agGQ04Q" element="property_of_stereotype:/SysML::Requirements::Requirement::text">
+ <manager xmi:type="nattableaxisconfiguration:AxisManagerRepresentation" href="platform:/plugin/org.eclipse.papyrus.sysml.nattable.requirement.config/configs/requirement.nattableconfiguration#//@columnHeaderAxisConfiguration/@axisManagers.1"/>
+ </axis>
+ </columnAxisProvidersHistory>
+ <rowAxisProvidersHistory xmi:type="nattableaxisprovider:MasterObjectAxisProvider" xmi:id="_Yn6OpQCQEeWudc8agGQ04Q" description="Provides the requirements directly owned by the context of the table" name="Requirement Axis Provider" disconnectSlave="true"/>
+ </nattable:Table>
+ <notation:Diagram xmi:id="_G7-rgACoEeWnE_cMzyyIKA" type="PapyrusUMLClassDiagram" name="Plug-ins" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_KlVX0ACoEeWnE_cMzyyIKA" type="2002">
+ <children xmi:type="notation:DecorationNode" xmi:id="_KlVX0gCoEeWnE_cMzyyIKA" type="5005"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_KlVX0wCoEeWnE_cMzyyIKA" type="8503">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KlVX1ACoEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KlV-4ACoEeWnE_cMzyyIKA" visible="false" type="7002">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KlV-4QCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_KlV-4gCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_KlV-4wCoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KlV-5ACoEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KlV-5QCoEeWnE_cMzyyIKA" visible="false" type="7003">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KlV-5gCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_KlV-5wCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_KlV-6ACoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KlV-6QCoEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KlV-6gCoEeWnE_cMzyyIKA" visible="false" type="7004">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KlV-6wCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_KlV-7ACoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_KlV-7QCoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KlV-7gCoEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Component" href="design.uml#_hTJT4AClEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KlVX0QCoEeWnE_cMzyyIKA" x="145" y="62" height="52"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Kl0gAACoEeWnE_cMzyyIKA" type="2002">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Kl1HEACoEeWnE_cMzyyIKA" type="5005"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Kl1HEQCoEeWnE_cMzyyIKA" type="8503">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Kl1HEgCoEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Kl1HEwCoEeWnE_cMzyyIKA" visible="false" type="7002">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Kl1HFACoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Kl1HFQCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Kl1HFgCoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Kl1HFwCoEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Kl1HGACoEeWnE_cMzyyIKA" visible="false" type="7003">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Kl1HGQCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Kl1HGgCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Kl1HGwCoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Kl1HHACoEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Kl1HHQCoEeWnE_cMzyyIKA" visible="false" type="7004">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Kl1HHgCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Kl1HHwCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Kl1HIACoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Kl1HIQCoEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Component" href="design.uml#_i-pMYAClEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Kl0gAQCoEeWnE_cMzyyIKA" x="404" y="195" height="52"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_KmCicACoEeWnE_cMzyyIKA" type="2002">
+ <children xmi:type="notation:DecorationNode" xmi:id="_KmCicgCoEeWnE_cMzyyIKA" type="5005"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_KmCicwCoEeWnE_cMzyyIKA" type="8503">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KmCidACoEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KmCidQCoEeWnE_cMzyyIKA" visible="false" type="7002">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KmCidgCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_KmCidwCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_KmCieACoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KmCieQCoEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KmCiegCoEeWnE_cMzyyIKA" visible="false" type="7003">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KmCiewCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_KmCifACoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_KmCifQCoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KmCifgCoEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KmCifwCoEeWnE_cMzyyIKA" visible="false" type="7004">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KmCigACoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_KmCigQCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_KmCiggCoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KmCigwCoEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Component" href="design.uml#_murvgAClEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KmCicQCoEeWnE_cMzyyIKA" x="479" y="44" height="52"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_KmTBIACoEeWnE_cMzyyIKA" type="2007">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_C7njsADEEeWt3cohpcF8rA" source="PapyrusHyperLink_Page" references="_qHdGgADDEeWt3cohpcF8rA">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_C7njsQDEEeWt3cohpcF8rA" key="tooltip_text" value="Sync Framework Core Classes"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_C7njsgDEEeWt3cohpcF8rA" key="pageName" value="Sync Framework Core Classes"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_C7njswDEEeWt3cohpcF8rA" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_KmToMACoEeWnE_cMzyyIKA" type="5026"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KmToMQCoEeWnE_cMzyyIKA" type="7016">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KmToMgCoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KmToMwCoEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Package" href="design.uml#_AtaF4ACnEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KmTBIQCoEeWnE_cMzyyIKA" x="-13" y="284"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_KmnxQACoEeWnE_cMzyyIKA" type="2007">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_76OpwACxEeWnE_cMzyyIKA" source="PapyrusHyperLink_Page" references="_6WeYAACxEeWnE_cMzyyIKA">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_76OpwQCxEeWnE_cMzyyIKA" key="tooltip_text" value="Sync Service Classes"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_76OpwgCxEeWnE_cMzyyIKA" key="pageName" value="Sync Service Classes"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_76OpwwCxEeWnE_cMzyyIKA" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_KmoYUACoEeWnE_cMzyyIKA" type="5026"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KmoYUQCoEeWnE_cMzyyIKA" type="7016">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KmoYUgCoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KmoYUwCoEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Package" href="design.uml#_DEZLYACnEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KmnxQQCoEeWnE_cMzyyIKA" x="249" y="277"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_QlQ58ACoEeWnE_cMzyyIKA" type="2014">
+ <children xmi:type="notation:DecorationNode" xmi:id="_QlRhAACoEeWnE_cMzyyIKA" type="1">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QlRhAQCoEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_QlRhAgCoEeWnE_cMzyyIKA" type="8522">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QlRhAwCoEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <element xmi:type="uml:Realization" href="design.uml#_OjDxoACoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QlRhBACoEeWnE_cMzyyIKA" x="187" y="234"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_hKtCMACoEeWnE_cMzyyIKA" type="2007">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_vCTOcAFIEeWqpuSzEVw8LA" source="PapyrusHyperLink_Page" references="_hZpaIADJEeWt3cohpcF8rA">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_vCTOcQFIEeWqpuSzEVw8LA" key="tooltip_text" value="Notation Sync Classes"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_vCTOcgFIEeWqpuSzEVw8LA" key="pageName" value="Notation Sync Classes"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_vCTOcwFIEeWqpuSzEVw8LA" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_hKtCMgCoEeWnE_cMzyyIKA" type="5026"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hKtCMwCoEeWnE_cMzyyIKA" type="7016">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hKtCNACoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hKtCNQCoEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Package" href="design.uml#_hKj4QACoEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hKtCMQCoEeWnE_cMzyyIKA" x="518" y="313"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Jy_oAADAEeWt3cohpcF8rA" type="2007">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_mp9zUADAEeWt3cohpcF8rA" source="PapyrusHyperLink_Page" references="_hvNJgADAEeWt3cohpcF8rA">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_mp9zUQDAEeWt3cohpcF8rA" key="tooltip_text" value="Sync Policy Classes"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_mp9zUgDAEeWt3cohpcF8rA" key="pageName" value="Sync Policy Classes"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_mp9zUwDAEeWt3cohpcF8rA" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_JzBdMADAEeWt3cohpcF8rA" type="5026"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_JzBdMQDAEeWt3cohpcF8rA" type="7016">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_JzBdMgDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JzBdMwDAEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Package" href="design.uml#_Jxw48ADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Jy_oAQDAEeWt3cohpcF8rA" x="150" y="399"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_G7-rgQCoEeWnE_cMzyyIKA" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_G7-rggCoEeWnE_cMzyyIKA"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_G7-rgwCoEeWnE_cMzyyIKA">
+ <owner xmi:type="uml:Model" href="design.uml#_y3pENgCLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xmi:type="uml:Model" href="design.uml#_y3pENgCLEeWudc8agGQ04Q"/>
+ <edges xmi:type="notation:Connector" xmi:id="_QluM8ACoEeWnE_cMzyyIKA" type="4018" source="_KmTBIACoEeWnE_cMzyyIKA" target="_QlQ58ACoEeWnE_cMzyyIKA">
+ <styles xmi:type="notation:FontStyle" xmi:id="_QluM8QCoEeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Realization" href="design.uml#_OjDxoACoEeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_QluM8gCoEeWnE_cMzyyIKA" points="[-18, -50, 101, 285]$[-119, -335, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_T9jrcACoEeWnE_cMzyyIKA" id="(0.57,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_T9jrcQCoEeWnE_cMzyyIKA" id="(0.3,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_Ql5zIACoEeWnE_cMzyyIKA" type="4018" source="_QlQ58ACoEeWnE_cMzyyIKA" target="_KlVX0ACoEeWnE_cMzyyIKA">
+ <styles xmi:type="notation:FontStyle" xmi:id="_Ql5zIQCoEeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Realization" href="design.uml#_OjDxoACoEeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Ql5zIgCoEeWnE_cMzyyIKA" points="[0, 0, -29, 72]$[29, -72, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_T9kSgQCoEeWnE_cMzyyIKA" id="(0.5,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_T9kSggCoEeWnE_cMzyyIKA" id="(0.4774193548387097,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_QmDkIACoEeWnE_cMzyyIKA" type="4018" source="_KmnxQACoEeWnE_cMzyyIKA" target="_QlQ58ACoEeWnE_cMzyyIKA">
+ <styles xmi:type="notation:FontStyle" xmi:id="_QmDkIQCoEeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Realization" href="design.uml#_OjDxoACoEeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_QmDkIgCoEeWnE_cMzyyIKA" points="[-47, -50, 357, 383]$[-404, -433, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_T9jrcgCoEeWnE_cMzyyIKA" id="(0.17,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_T9kSgACoEeWnE_cMzyyIKA" id="(1.0,0.8)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_kqh_EACoEeWnE_cMzyyIKA" type="4007" source="_Kl0gAACoEeWnE_cMzyyIKA" target="_KlVX0ACoEeWnE_cMzyyIKA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_kqimIACoEeWnE_cMzyyIKA" type="6016">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kqimIQCoEeWnE_cMzyyIKA" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kqimIgCoEeWnE_cMzyyIKA" type="6017">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kqimIwCoEeWnE_cMzyyIKA" x="-10" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_kqh_EQCoEeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Usage" href="design.uml#_q-QHQAClEeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kqh_EgCoEeWnE_cMzyyIKA" points="[-76, -50, 154, 101]$[-154, -101, 76, 50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kX3WMACyEeWnE_cMzyyIKA" id="(0.23222748815165878,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kX3WMQCyEeWnE_cMzyyIKA" id="(0.8580645161290322,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_kq5ygACoEeWnE_cMzyyIKA" type="4007" source="_KmCicACoEeWnE_cMzyyIKA" target="_KlVX0ACoEeWnE_cMzyyIKA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_kq6ZkACoEeWnE_cMzyyIKA" type="6016">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kq6ZkQCoEeWnE_cMzyyIKA" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kq6ZkgCoEeWnE_cMzyyIKA" type="6017">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kq6ZkwCoEeWnE_cMzyyIKA" x="2" y="19"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_kq5ygQCoEeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Usage" href="design.uml#_ppcQcAClEeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kq5yggCoEeWnE_cMzyyIKA" points="[-72, 3, 257, -15]$[-251, 13, 78, -5]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_krKRMACoEeWnE_cMzyyIKA" type="4007" source="_KmCicACoEeWnE_cMzyyIKA" target="_Kl0gAACoEeWnE_cMzyyIKA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_krKRMwCoEeWnE_cMzyyIKA" type="6016">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_krKRNACoEeWnE_cMzyyIKA" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_krK4QACoEeWnE_cMzyyIKA" type="6017">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_krK4QQCoEeWnE_cMzyyIKA" x="5" y="21"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_krKRMQCoEeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Usage" href="design.uml#_qOZ-sAClEeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_krKRMgCoEeWnE_cMzyyIKA" points="[-29, 50, 70, -119]$[-70, 119, 29, -50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kX2vIACyEeWnE_cMzyyIKA" id="(0.4482758620689655,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kX2vIQCyEeWnE_cMzyyIKA" id="(0.5308056872037915,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nd0mEACoEeWnE_cMzyyIKA" type="4005" source="_hKtCMACoEeWnE_cMzyyIKA" target="_Kl0gAACoEeWnE_cMzyyIKA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nd0mEwCoEeWnE_cMzyyIKA" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nd0mFACoEeWnE_cMzyyIKA" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nd0mFQCoEeWnE_cMzyyIKA" type="6013">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nd0mFgCoEeWnE_cMzyyIKA" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nd0mEQCoEeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Realization" href="design.uml#_ndmjoACoEeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nd0mEgCoEeWnE_cMzyyIKA" points="[-17, -19, 83, 95]$[-60, -111, 40, 3]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_neZ04ACoEeWnE_cMzyyIKA" id="(0.3142857142857143,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_neZ04QCoEeWnE_cMzyyIKA" id="(0.7488151658767772,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_VakvIADAEeWt3cohpcF8rA" type="4018" source="_Jy_oAADAEeWt3cohpcF8rA" target="_QlQ58ACoEeWnE_cMzyyIKA">
+ <styles xmi:type="notation:FontStyle" xmi:id="_VakvIQDAEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Realization" href="design.uml#_OjDxoACoEeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_VakvIgDAEeWt3cohpcF8rA" points="[-13, -50, 45, 181]$[-57, -226, 1, 5]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WmGuIADAEeWt3cohpcF8rA" id="(0.43,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WmHVMADAEeWt3cohpcF8rA" id="(0.6,1.0)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_6WeYAACxEeWnE_cMzyyIKA" type="PapyrusUMLClassDiagram" name="Sync Service Classes" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_BDaxIACyEeWnE_cMzyyIKA" type="2004">
+ <children xmi:type="notation:DecorationNode" xmi:id="_BDaxIgCyEeWnE_cMzyyIKA" type="5011"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_BDaxIwCyEeWnE_cMzyyIKA" type="8507">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_BDaxJACyEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_BDaxJQCyEeWnE_cMzyyIKA" type="7006">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_BDaxJgCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_BDaxJwCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_BDaxKACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_BDaxKQCyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_BDaxKgCyEeWnE_cMzyyIKA" type="7007">
+ <children xmi:type="notation:Shape" xmi:id="_2Gn28ACyEeWnE_cMzyyIKA" type="3007">
+ <element xmi:type="uml:Operation" href="design.uml#_2Gde4ACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2Gn28QCyEeWnE_cMzyyIKA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_BDaxKwCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_BDaxLACyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_BDaxLQCyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_BDaxLgCyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_BDaxLwCyEeWnE_cMzyyIKA" type="7008">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_BDaxMACyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_BDaxMQCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_BDaxMgCyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_BDaxMwCyEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Interface" href="design.uml#_BDQZEACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_BDaxIQCyEeWnE_cMzyyIKA" x="39" y="96"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_CbL1UACyEeWnE_cMzyyIKA" type="2004">
+ <children xmi:type="notation:DecorationNode" xmi:id="_CbL1UgCyEeWnE_cMzyyIKA" type="5011"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CbL1UwCyEeWnE_cMzyyIKA" type="8507">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CbL1VACyEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CbMcYACyEeWnE_cMzyyIKA" type="7006">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CbMcYQCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CbMcYgCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CbMcYwCyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CbMcZACyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CbMcZQCyEeWnE_cMzyyIKA" type="7007">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CbMcZgCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CbMcZwCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CbMcaACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CbMcaQCyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CbMcagCyEeWnE_cMzyyIKA" type="7008">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CbMcawCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CbMcbACyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CbMcbQCyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CbMcbgCyEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Interface" href="design.uml#_CbCEUACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CbL1UQCyEeWnE_cMzyyIKA" x="482" y="77"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_E997IACyEeWnE_cMzyyIKA" type="2004">
+ <children xmi:type="notation:DecorationNode" xmi:id="_E997IgCyEeWnE_cMzyyIKA" type="5011"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_E997IwCyEeWnE_cMzyyIKA" type="8507">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_E997JACyEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_E997JQCyEeWnE_cMzyyIKA" type="7006">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_E997JgCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_E997JwCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_E997KACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E997KQCyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_E997KgCyEeWnE_cMzyyIKA" type="7007">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_E997KwCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_E997LACyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_E997LQCyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E997LgCyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_E997LwCyEeWnE_cMzyyIKA" type="7008">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_E997MACyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_E997MQCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_E997MgCyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E997MwCyEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Interface" href="design.uml#_E9y8AACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E997IQCyEeWnE_cMzyyIKA" x="453" y="292"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_KiabIACyEeWnE_cMzyyIKA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_KibCMACyEeWnE_cMzyyIKA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_KibCMQCyEeWnE_cMzyyIKA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KibCMgCyEeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KibCMwCyEeWnE_cMzyyIKA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KibCNACyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_KibCNQCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_KibCNgCyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KibCNwCyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KibCOACyEeWnE_cMzyyIKA" type="7018">
+ <children xmi:type="notation:Shape" xmi:id="_dbjYcAC_EeWnc73YHF_Igw" type="3013">
+ <element xmi:type="uml:Operation" href="design.uml#_da-wsAC_EeWnc73YHF_Igw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_dbjYcQC_EeWnc73YHF_Igw"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KibCOQCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_KibCOgCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_KibCOwCyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KibCPACyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_KibCPQCyEeWnE_cMzyyIKA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_KibCPgCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_KibCPwCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_KibCQACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KibCQQCyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Kit9IACyEeWnE_cMzyyIKA" type="compartment_shape_display">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Kit9IQCyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Kit9IgCyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_L1Fj8ACyEeWnE_cMzyyIKA" type="3015">
+ <children xmi:type="notation:DecorationNode" xmi:id="_L1Fj8gCyEeWnE_cMzyyIKA" type="7014">
+ <children xmi:type="notation:Shape" xmi:id="_OKOPUACyEeWnE_cMzyyIKA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_OKGTgACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_OKOPUQCyEeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_SuKUkACyEeWnE_cMzyyIKA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_SuCYwACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_SuKUkQCyEeWnE_cMzyyIKA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_L1Fj8wCyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_L1Fj9ACyEeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_L1Fj9QCyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_L1Fj9gCyEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:RedefinableTemplateSignature" href="design.uml#_L09oIACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_L1Fj8QCyEeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_KiQqIACyEeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KiabIQCyEeWnE_cMzyyIKA" x="52" y="317" width="206"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_8aQGQAC0EeWnE_cMzyyIKA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_8aQGQgC0EeWnE_cMzyyIKA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_8aQGQwC0EeWnE_cMzyyIKA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_8aQGRAC0EeWnE_cMzyyIKA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8aQGRQC0EeWnE_cMzyyIKA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8aQGRgC0EeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8aQGRwC0EeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8aQGSAC0EeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8aQGSQC0EeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8aQGSgC0EeWnE_cMzyyIKA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8aQGSwC0EeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8aQGTAC0EeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8aQGTQC0EeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8aQGTgC0EeWnE_cMzyyIKA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8aQGTwC0EeWnE_cMzyyIKA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8aQGUAC0EeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8aQGUQC0EeWnE_cMzyyIKA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8aQGUgC0EeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8aQGUwC0EeWnE_cMzyyIKA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_8aHjYAC0EeWnE_cMzyyIKA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8aQGQQC0EeWnE_cMzyyIKA" x="454" y="445"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_6WeYAQCxEeWnE_cMzyyIKA" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_6WeYAgCxEeWnE_cMzyyIKA"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_6WeYAwCxEeWnE_cMzyyIKA">
+ <owner xmi:type="uml:Package" href="design.uml#_DEZLYACnEeWnE_cMzyyIKA"/>
+ </styles>
+ <element xmi:type="uml:Package" href="design.uml#_DEZLYACnEeWnE_cMzyyIKA"/>
+ <edges xmi:type="notation:Connector" xmi:id="_ob3-MACyEeWnE_cMzyyIKA" type="4001" source="_KiabIACyEeWnE_cMzyyIKA" target="_BDaxIACyEeWnE_cMzyyIKA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ob3-MwCyEeWnE_cMzyyIKA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ob3-NACyEeWnE_cMzyyIKA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ob3-NQCyEeWnE_cMzyyIKA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ob3-NgCyEeWnE_cMzyyIKA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ob3-NwCyEeWnE_cMzyyIKA" visible="false" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ob3-OACyEeWnE_cMzyyIKA" x="1" y="-75"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ob3-OQCyEeWnE_cMzyyIKA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ob3-OgCyEeWnE_cMzyyIKA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ob3-OwCyEeWnE_cMzyyIKA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ob3-PACyEeWnE_cMzyyIKA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ob4lQACyEeWnE_cMzyyIKA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ob4lQQCyEeWnE_cMzyyIKA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_ob3-MQCyEeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Association" href="design.uml#_obmRYACyEeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ob3-MgCyEeWnE_cMzyyIKA" points="[-1, -15, 13, 171]$[14, -136, 28, 50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ocZioACyEeWnE_cMzyyIKA" id="(0.5048543689320388,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ocZioQCyEeWnE_cMzyyIKA" id="(0.527027027027027,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_WbVfAAC0EeWnE_cMzyyIKA" type="4007" source="_BDaxIACyEeWnE_cMzyyIKA" target="_CbL1UACyEeWnE_cMzyyIKA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_WbWGEAC0EeWnE_cMzyyIKA" type="6016">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WbWGEQC0EeWnE_cMzyyIKA" x="-2" y="-18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WbWGEgC0EeWnE_cMzyyIKA" type="6017">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WbWGEwC0EeWnE_cMzyyIKA" y="25"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_WbVfAQC0EeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Usage" href="design.uml#_WbM8IAC0EeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_WbVfAgC0EeWnE_cMzyyIKA" points="[22, 5, -232, 0]$[231, -1, -23, -6]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Wb2cYAC0EeWnE_cMzyyIKA" id="(1.0,0.18691588785046728)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Wb2cYQC0EeWnE_cMzyyIKA" id="(0.0,0.43)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_eakmcAC0EeWnE_cMzyyIKA" type="4007" source="_CbL1UACyEeWnE_cMzyyIKA" target="_E997IACyEeWnE_cMzyyIKA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ealNgAC0EeWnE_cMzyyIKA" type="6016">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ealNgQC0EeWnE_cMzyyIKA" x="4" y="-29"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ealNggC0EeWnE_cMzyyIKA" type="6017">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ealNgwC0EeWnE_cMzyyIKA" x="4" y="28"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_eakmcQC0EeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Usage" href="design.uml#_eacDkAC0EeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_eakmcgC0EeWnE_cMzyyIKA" points="[-3, 18, 25, -165]$[-21, 133, 7, -50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ebB5cAC0EeWnE_cMzyyIKA" id="(0.46,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ebB5cQC0EeWnE_cMzyyIKA" id="(0.61,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_gpDQMAC0EeWnE_cMzyyIKA" type="4007" source="_BDaxIACyEeWnE_cMzyyIKA" target="_E997IACyEeWnE_cMzyyIKA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_gpDQMwC0EeWnE_cMzyyIKA" type="6016">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gpDQNAC0EeWnE_cMzyyIKA" x="-16" y="-15"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gpDQNQC0EeWnE_cMzyyIKA" type="6017">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gpDQNgC0EeWnE_cMzyyIKA" x="-8" y="17"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_gpDQMQC0EeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:Usage" href="design.uml#_go6tUAC0EeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gpDQMgC0EeWnE_cMzyyIKA" points="[15, 12, -193, -165]$[195, 177, -13, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gphxUAC0EeWnE_cMzyyIKA" id="(1.0,0.7663551401869159)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gphxUQC0EeWnE_cMzyyIKA" id="(0.0,0.39)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_IXT4sAC2EeWnE_cMzyyIKA" type="4003" source="_8aQGQAC0EeWnE_cMzyyIKA" target="_E997IACyEeWnE_cMzyyIKA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_IXT4swC2EeWnE_cMzyyIKA" type="6008">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_IXT4tAC2EeWnE_cMzyyIKA" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_IXUfwAC2EeWnE_cMzyyIKA" type="6009">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_IXUfwQC2EeWnE_cMzyyIKA" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_IXT4sQC2EeWnE_cMzyyIKA"/>
+ <element xmi:type="uml:InterfaceRealization" href="design.uml#_IXISgAC2EeWnE_cMzyyIKA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_IXT4sgC2EeWnE_cMzyyIKA" points="[-6, -22, 2, 103]$[-6, -75, 2, 50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_IYC4gAC2EeWnE_cMzyyIKA" id="(0.55,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_IYC4gQC2EeWnE_cMzyyIKA" id="(0.53,1.0)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_hvNJgADAEeWt3cohpcF8rA" type="PapyrusUMLClassDiagram" name="Sync Policy Classes" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_rrsn0ADAEeWt3cohpcF8rA" type="2004">
+ <children xmi:type="notation:DecorationNode" xmi:id="_rrtO4ADAEeWt3cohpcF8rA" type="5011"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_rrtO4QDAEeWt3cohpcF8rA" type="8507">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rrtO4gDAEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_rrtO4wDAEeWt3cohpcF8rA" type="7006">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_rrtO5ADAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rrtO5QDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rrtO5gDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rrtO5wDAEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_rrtO6ADAEeWt3cohpcF8rA" type="7007">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_rrtO6QDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rrtO6gDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rrtO6wDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rrtO7ADAEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_rrtO7QDAEeWt3cohpcF8rA" type="7008">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_rrtO7gDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rrtO7wDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rrtO8ADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rrtO8QDAEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Interface" href="design.uml#_rrfMcADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rrsn0QDAEeWt3cohpcF8rA" x="76" y="78"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_tDAZAADAEeWt3cohpcF8rA" type="2004">
+ <children xmi:type="notation:DecorationNode" xmi:id="_tDBAEADAEeWt3cohpcF8rA" type="5011"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_tDBAEQDAEeWt3cohpcF8rA" type="8507">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_tDBAEgDAEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_tDBAEwDAEeWt3cohpcF8rA" type="7006">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_tDBAFADAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_tDBAFQDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_tDBAFgDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tDBAFwDAEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_tDBAGADAEeWt3cohpcF8rA" type="7007">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_tDBAGQDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_tDBAGgDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_tDBAGwDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tDBAHADAEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_tDBAHQDAEeWt3cohpcF8rA" type="7008">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_tDBAHgDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_tDBAHwDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_tDBAIADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tDBAIQDAEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Interface" href="design.uml#_tC0LwADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tDAZAQDAEeWt3cohpcF8rA" x="418" y="109"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_v6HJAADAEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_v6HJAgDAEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_v6HJAwDAEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_v6HJBADAEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_v6HJBQDAEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_v6HJBgDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_v6HJBwDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_v6HJCADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v6HJCQDAEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_v6HJCgDAEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_v6HJCwDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_v6HJDADAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_v6HJDQDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v6HJDgDAEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_v6HwEADAEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_v6HwEQDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_v6HwEgDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_v6HwEwDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v6HwFADAEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_v56UsADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v6HJAQDAEeWt3cohpcF8rA" x="496" y="305"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3hpiIADAEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3hqJMADAEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3hqJMQDAEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3hqJMgDAEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3hqJMwDAEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_3hqJNADAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_3hqJNQDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_3hqJNgDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3hqJNwDAEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3hqJOADAEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_3hqJOQDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_3hqJOgDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_3hqJOwDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3hqJPADAEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3hqJPQDAEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_3hqJPgDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_3hqJPwDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_3hqJQADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3hqJQQDAEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_3hd78ADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3hpiIQDAEeWt3cohpcF8rA" x="70" y="247"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_61EasADAEeWt3cohpcF8rA" type="2004">
+ <children xmi:type="notation:DecorationNode" xmi:id="_61EasgDAEeWt3cohpcF8rA" type="5011"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_61EaswDAEeWt3cohpcF8rA" type="8507">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_61EatADAEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_61EatQDAEeWt3cohpcF8rA" type="7006">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_61EatgDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_61EatwDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_61EauADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_61EauQDAEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_61EaugDAEeWt3cohpcF8rA" type="7007">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_61EauwDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_61EavADAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_61EavQDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_61EavgDAEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_61FBwADAEeWt3cohpcF8rA" type="7008">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_61FBwQDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_61FBwgDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_61FBwwDAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_61FBxADAEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Interface" href="design.uml#_603mYADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_61EasQDAEeWt3cohpcF8rA" x="241" y="310"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Ggv3UADEEeWt3cohpcF8rA" type="2008" fillColor="12632256">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_PXfOgADEEeWt3cohpcF8rA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_PXfOgQDEEeWt3cohpcF8rA" key="QualifiedNameDepth" value="2"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Ggv3UgDEEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Ggv3UwDEEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Ggv3VADEEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Ggv3VQDEEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Ggv3VgDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Ggv3VwDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Ggv3WADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ggv3WQDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Ggv3WgDEEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Ggv3WwDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Ggv3XADEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Ggv3XQDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ggv3XgDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_GgweYADEEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_GgweYQDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_GgweYgDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_GgweYwDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_GgweZADEEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_sVtGwADDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ggv3UQDEEeWt3cohpcF8rA" x="638" y="109"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_hvNJgQDAEeWt3cohpcF8rA" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_hvNJggDAEeWt3cohpcF8rA"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_hvNJgwDAEeWt3cohpcF8rA">
+ <owner xmi:type="uml:Package" href="design.uml#_Jxw48ADAEeWt3cohpcF8rA"/>
+ </styles>
+ <element xmi:type="uml:Package" href="design.uml#_Jxw48ADAEeWt3cohpcF8rA"/>
+ <edges xmi:type="notation:Connector" xmi:id="_yf_mIADAEeWt3cohpcF8rA" type="4003" source="_v6HJAADAEeWt3cohpcF8rA" target="_tDAZAADAEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ygANMADAEeWt3cohpcF8rA" type="6008">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ygANMQDAEeWt3cohpcF8rA" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ygANMgDAEeWt3cohpcF8rA" type="6009">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ygANMwDAEeWt3cohpcF8rA" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_yf_mIQDAEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:InterfaceRealization" href="design.uml#_yffP0ADAEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_yf_mIgDAEeWt3cohpcF8rA" points="[7, -14, 0, 119]$[3, -113, -4, 20]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_yghxoADAEeWt3cohpcF8rA" id="(0.46153846153846156,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_yghxoQDAEeWt3cohpcF8rA" id="(0.5892857142857143,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_0HHU8ADAEeWt3cohpcF8rA" type="4007" source="_3hpiIADAEeWt3cohpcF8rA" target="_tDAZAADAEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_0HH8AADAEeWt3cohpcF8rA" type="6016">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0HH8AQDAEeWt3cohpcF8rA" x="-10" y="-25"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_0HH8AgDAEeWt3cohpcF8rA" type="6017">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_4WWDkADCEeWt3cohpcF8rA" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_4WWDkQDCEeWt3cohpcF8rA" key="visible" value="true"/>
+ </eAnnotations>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0HH8AwDAEeWt3cohpcF8rA" y="18"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_0HHU8QDAEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Usage" href="design.uml#_0G55kADAEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_0HHU8gDAEeWt3cohpcF8rA" points="[30, 5, -193, -23]$[192, -22, -31, -50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_0HkA4ADAEeWt3cohpcF8rA" id="(1.0,0.32)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_0HkA4QDAEeWt3cohpcF8rA" id="(0.0,0.25)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_5QfCgADAEeWt3cohpcF8rA" type="4003" source="_3hpiIADAEeWt3cohpcF8rA" target="_rrsn0ADAEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_5QfpkADAEeWt3cohpcF8rA" type="6008">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5QfpkQDAEeWt3cohpcF8rA" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5QfpkgDAEeWt3cohpcF8rA" type="6009">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5QfpkwDAEeWt3cohpcF8rA" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_5QfCgQDAEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:InterfaceRealization" href="design.uml#_5P9eEADAEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_5QfCggDAEeWt3cohpcF8rA" points="[2, -12, -23, 155]$[75, -158, 50, 9]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_5Q9joADAEeWt3cohpcF8rA" id="(0.5490196078431373,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_5Q9joQDAEeWt3cohpcF8rA" id="(0.5,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_e4LckADBEeWt3cohpcF8rA" type="4001" source="_61EasADAEeWt3cohpcF8rA" target="_tDAZAADAEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_e4MDoADBEeWt3cohpcF8rA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_e4MDoQDBEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_e4MDogDBEeWt3cohpcF8rA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_e4MDowDBEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_e4MDpADBEeWt3cohpcF8rA" visible="false" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_e4MDpQDBEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_e4MDpgDBEeWt3cohpcF8rA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_e4MDpwDBEeWt3cohpcF8rA" x="-8" y="31"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_e4MDqADBEeWt3cohpcF8rA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_e4MDqQDBEeWt3cohpcF8rA" x="14" y="11"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_e4MqsADBEeWt3cohpcF8rA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_e4MqsQDBEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_e4LckQDBEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Association" href="design.uml#_e3wl0ADBEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_e4LckgDBEeWt3cohpcF8rA" points="[11, -11, -133, 118]$[88, -122, -56, 7]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_e41j4ADBEeWt3cohpcF8rA" id="(0.7236842105263158,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_e41j4QDBEeWt3cohpcF8rA" id="(0.0,0.91)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_zuQ6oADBEeWt3cohpcF8rA" type="4001" source="_3hpiIADAEeWt3cohpcF8rA" target="_61EasADAEeWt3cohpcF8rA" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_zuRhsADBEeWt3cohpcF8rA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zuRhsQDBEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_zuRhsgDBEeWt3cohpcF8rA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zuRhswDBEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_zuRhtADBEeWt3cohpcF8rA" visible="false" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zuRhtQDBEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_zuRhtgDBEeWt3cohpcF8rA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zuRhtwDBEeWt3cohpcF8rA" x="-22" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_zuSIwADBEeWt3cohpcF8rA" visible="false" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zuSIwQDBEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_zuSIwgDBEeWt3cohpcF8rA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zuSIwwDBEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_zuQ6oQDBEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Association" href="design.uml#_zt35EADBEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_zuQ6ogDBEeWt3cohpcF8rA" points="[-20, 82, -89, 18]$[-27, 112, -96, 48]$[69, 64, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zu_TYADBEeWt3cohpcF8rA" id="(1.0,0.18)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zu_6cADBEeWt3cohpcF8rA" id="(0.0,0.19)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_Fq2cAADCEeWt3cohpcF8rA" type="4008" source="_v6HJAADAEeWt3cohpcF8rA" target="_61EasADAEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Fq3DEADCEeWt3cohpcF8rA" type="6026">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Fq3DEQDCEeWt3cohpcF8rA" x="-3" y="17"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Fq3DEgDCEeWt3cohpcF8rA" type="6027">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Fq3DEwDCEeWt3cohpcF8rA" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_Fq2cAQDCEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Dependency" href="design.uml#_FqOw8ADCEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Fq2cAgDCEeWt3cohpcF8rA" points="[-52, -9, 122, 19]$[-155, -30, 19, -2]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Frf8QADCEeWt3cohpcF8rA" id="(0.0,0.38)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Frf8QQDCEeWt3cohpcF8rA" id="(1.0,0.46)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_I04dIADEEeWt3cohpcF8rA" type="4008" source="_tDAZAADAEeWt3cohpcF8rA" target="_Ggv3UADEEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_I05EMADEEeWt3cohpcF8rA" type="6026">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_I05EMQDEEeWt3cohpcF8rA" x="-2" y="-12"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_I05EMgDEEeWt3cohpcF8rA" type="6027">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_I05EMwDEEeWt3cohpcF8rA" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_I04dIQDEEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Dependency" href="design.uml#_I0sP4ADEEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_I04dIgDEEeWt3cohpcF8rA" points="[34, 4, -128, -18]$[142, 11, -20, -11]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_I1rHUADEEeWt3cohpcF8rA" id="(1.0,0.31)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_I1rHUQDEEeWt3cohpcF8rA" id="(0.0,0.31)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_qHdGgADDEeWt3cohpcF8rA" type="PapyrusUMLClassDiagram" name="Sync Framework Core Classes" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_sV4F4ADDEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_sV4s8ADDEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_sV4s8QDDEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_sV4s8gDDEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_sV4s8wDDEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_sV4s9ADDEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_sV4s9QDDEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_sV4s9gDDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sV4s9wDDEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_sV4s-ADDEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_sV4s-QDDEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_sV4s-gDDEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_sV4s-wDDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sV4s_ADDEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_sV4s_QDDEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_sV4s_gDDEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_sV4s_wDDEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_sV4tAADDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sV4tAQDDEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_sV8-YADDEeWt3cohpcF8rA" type="compartment_shape_display">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_sV8-YQDDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sV8-YgDDEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_tv_TcADDEeWt3cohpcF8rA" type="3015">
+ <children xmi:type="notation:DecorationNode" xmi:id="_tv_6gADDEeWt3cohpcF8rA" type="7014">
+ <children xmi:type="notation:Shape" xmi:id="_uUCbsADDEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_uT-xUADDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uUCbsQDDEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ztSYUADDEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_ztOt8ADDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ztSYUQDDEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_43hokADDEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_43dXIADDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_43hokQDDEeWt3cohpcF8rA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_tv_6gQDDEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_tv_6ggDDEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_tv_6gwDDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tv_6hADDEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:RedefinableTemplateSignature" href="design.uml#_tv7CAADDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tv_TcQDDEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_sVtGwADDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sV4F4QDDEeWt3cohpcF8rA" x="469" y="182" width="179"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ny2xMADEEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ny3YQADEEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ny3YQQDEEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ny3YQgDEEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ny3YQwDEEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ny3YRADEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ny3YRQDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ny3YRgDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ny3YRwDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ny3YSADEEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ny3YSQDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ny3YSgDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ny3YSwDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ny3YTADEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ny3YTQDEEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ny3YTgDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ny3YTwDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ny3YUADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ny3YUQDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ny830ADEEeWt3cohpcF8rA" type="compartment_shape_display">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ny830QDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ny830gDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_zyzfkADFEeWt3cohpcF8rA" type="3015">
+ <children xmi:type="notation:DecorationNode" xmi:id="_zyzfkgDFEeWt3cohpcF8rA" type="7014">
+ <children xmi:type="notation:Shape" xmi:id="_0N0AkADFEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_jJG-4gDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0N0AkQDFEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_0pqPEADFEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_jJG-5ADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0pqPEQDFEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_1GTHwADFEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_jJG-5gDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_1GTHwQDFEeWt3cohpcF8rA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_zyzfkwDFEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_zyzflADFEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_zyzflQDFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zyzflgDFEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:RedefinableTemplateSignature" href="design.uml#_jJG-4QDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zyzfkQDFEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_jJG-4ADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ny2xMQDEEeWt3cohpcF8rA" x="27" y="202" width="172"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nzH28ADEEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nzH28gDEEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nzH28wDEEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nzH29ADEEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzIeAADEEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzIeAQDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nzIeAgDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nzIeAwDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzIeBADEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzIeBQDEEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzIeBgDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nzIeBwDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nzIeCADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzIeCQDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzIeCgDEEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzIeCwDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nzIeDADEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nzIeDQDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzIeDgDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzNWgADEEeWt3cohpcF8rA" type="compartment_shape_display">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzNWgQDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzNWggDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_74ZtsADFEeWt3cohpcF8rA" type="3015">
+ <children xmi:type="notation:DecorationNode" xmi:id="_74ZtsgDFEeWt3cohpcF8rA" type="7014">
+ <children xmi:type="notation:Shape" xmi:id="_8UudUADFEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_jW6KUgDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_8UudUQDFEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_9JN1UADFEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_jW6KVADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_9JN1UQDFEeWt3cohpcF8rA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_74ZtswDFEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_74ZttADFEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_74ZttQDFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_74ZttgDFEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:RedefinableTemplateSignature" href="design.uml#_jW6KUQDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_74ZtsQDFEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_jW6KUADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzH28QDEEeWt3cohpcF8rA" x="303" y="372" width="151"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nzaK0ADEEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nzaK0gDEEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nzaK0wDEEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nzaK1ADEEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzaK1QDEEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzaK1gDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nzaK1wDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nzaK2ADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzaK2QDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzaK2gDEEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzaK2wDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nzaK3ADEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nzaK3QDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzaK3gDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzax4ADEEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzax4QDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nzax4gDEEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nzax4wDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzax5ADEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzfqYADEEeWt3cohpcF8rA" type="compartment_shape_display">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzfqYQDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzfqYgDEEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_AP55cADGEeWt3cohpcF8rA" type="3015">
+ <children xmi:type="notation:DecorationNode" xmi:id="_AP55cgDGEeWt3cohpcF8rA" type="7014">
+ <children xmi:type="notation:Shape" xmi:id="_BO6fYADGEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_kHf5wgDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_BO6fYQDGEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_BPKXAADGEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_kHf5xADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_BPKXAQDGEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_BPcD0ADGEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_kHf5xgDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_BPcD0QDGEeWt3cohpcF8rA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_AP55cwDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_AP55dADGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_AP55dQDGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_AP55dgDGEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:RedefinableTemplateSignature" href="design.uml#_kHf5wQDEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_AP55cQDGEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_kHf5wADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzaK0QDEEeWt3cohpcF8rA" x="254" y="41" width="180"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_VNuzsADFEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_VNvawADFEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_VNvawQDFEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VNvawgDFEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_VNvawwDFEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_VNvaxADFEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_VNvaxQDFEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_VNvaxgDFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_VNvaxwDFEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_VNvayADFEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_VNvayQDFEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_VNvaygDFEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_VNvaywDFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_VNvazADFEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_VNvazQDFEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_VNvazgDFEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_VNvazwDFEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_VNva0ADFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_VNva0QDFEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_VN06UADFEeWt3cohpcF8rA" type="compartment_shape_display">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_VN06UQDFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_VN06UgDFEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_kmClAADGEeWt3cohpcF8rA" type="3015">
+ <children xmi:type="notation:DecorationNode" xmi:id="_kmClAgDGEeWt3cohpcF8rA" type="7014">
+ <children xmi:type="notation:Shape" xmi:id="_lWDssADGEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_O9-F0gDFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lWDssQDGEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_lWXOsADGEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_O9-F1ADFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lWXOsQDGEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_lWtM8ADGEeWt3cohpcF8rA" type="3031">
+ <element xmi:type="uml:ClassifierTemplateParameter" href="design.uml#_O9-F1gDFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lWtM8QDGEeWt3cohpcF8rA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_kmClAwDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_kmClBADGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_kmClBQDGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kmClBgDGEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:RedefinableTemplateSignature" href="design.uml#_O9-F0QDFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kmClAQDGEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_O9-F0ADFEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_VNuzsQDFEeWt3cohpcF8rA" x="-3" y="374" width="218"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_HIEEEADGEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_HIErIADGEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_HIErIQDGEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_HIErIgDGEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_HIErIwDGEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_HIErJADGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_HIErJQDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_HIErJgDGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIErJwDGEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_HIErKADGEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_HIErKQDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_HIErKgDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_HIErKwDGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIErLADGEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_HIErLQDGEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_HIErLgDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_HIErLwDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_HIErMADGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIErMQDGEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_HH6TEADGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIEEEQDGEeWt3cohpcF8rA" x="503" y="379"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ISq2AADGEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ISrdEADGEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ISrdEQDGEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ISrdEgDGEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ISrdEwDGEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ISrdFADGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ISrdFQDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ISrdFgDGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ISrdFwDGEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ISrdGADGEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ISrdGQDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ISrdGgDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ISrdGwDGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ISrdHADGEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ISrdHQDGEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ISrdHgDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ISrdHwDGEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ISrdIADGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ISrdIQDGEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_IShFAADGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ISq2AQDGEeWt3cohpcF8rA" x="667" y="376"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_qHdGgQDDEeWt3cohpcF8rA" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_qHdGggDDEeWt3cohpcF8rA"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_qHdGgwDDEeWt3cohpcF8rA">
+ <owner xmi:type="uml:Package" href="design.uml#_AtaF4ACnEeWnE_cMzyyIKA"/>
+ </styles>
+ <element xmi:type="uml:Package" href="design.uml#_AtaF4ACnEeWnE_cMzyyIKA"/>
+ <edges xmi:type="notation:Connector" xmi:id="_u7BtwADEEeWt3cohpcF8rA" type="4001" source="_nzaK0ADEEeWt3cohpcF8rA" target="_ny2xMADEEeWt3cohpcF8rA" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_u7BtwwDEEeWt3cohpcF8rA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_u7CU0ADEEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_u7CU0QDEEeWt3cohpcF8rA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_u7CU0gDEEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_u7CU0wDEEeWt3cohpcF8rA" visible="false" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_u7CU1ADEEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_u7CU1QDEEeWt3cohpcF8rA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_u7CU1gDEEeWt3cohpcF8rA" x="-1" y="32"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_u7CU1wDEEeWt3cohpcF8rA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_u7CU2ADEEeWt3cohpcF8rA" x="3" y="-12"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_u7CU2QDEEeWt3cohpcF8rA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_u7CU2gDEEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_u7BtwQDEEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Association" href="design.uml#_u6uLwADEEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_u7BtwgDEEeWt3cohpcF8rA" points="[0, 3, 121, -107]$[-136, 3, -15, -107]$[-136, 110, -15, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_u7irIADEEeWt3cohpcF8rA" id="(0.0,0.51)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_u7jSMADEEeWt3cohpcF8rA" id="(0.6162790697674418,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_D80skADFEeWt3cohpcF8rA" type="4001" source="_ny2xMADEEeWt3cohpcF8rA" target="_nzH28ADEEeWt3cohpcF8rA" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_D80skwDFEeWt3cohpcF8rA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D80slADFEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D80slQDFEeWt3cohpcF8rA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D80slgDFEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D81ToADFEeWt3cohpcF8rA" visible="false" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D81ToQDFEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D81TogDFEeWt3cohpcF8rA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D81TowDFEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D81TpADFEeWt3cohpcF8rA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D81TpQDFEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D81TpgDFEeWt3cohpcF8rA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D81TpwDFEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_D80skQDFEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Association" href="design.uml#_D8euUADFEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D80skgDFEeWt3cohpcF8rA" points="[0, 13, -141, -66]$[149, 13, 8, -66]$[149, 79, 8, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D9VC4ADFEeWt3cohpcF8rA" id="(1.0,0.92)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D9VC4QDFEeWt3cohpcF8rA" id="(0.2913907284768212,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_WWnuYADFEeWt3cohpcF8rA" type="4001" source="_VNuzsADFEeWt3cohpcF8rA" target="_nzH28ADEEeWt3cohpcF8rA" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_WWnuYwDFEeWt3cohpcF8rA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WWnuZADFEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WWnuZQDFEeWt3cohpcF8rA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WWnuZgDFEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WWnuZwDFEeWt3cohpcF8rA" visible="false" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WWnuaADFEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WWnuaQDFEeWt3cohpcF8rA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WWoVcADFEeWt3cohpcF8rA" x="-11" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WWoVcQDFEeWt3cohpcF8rA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WWoVcgDFEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WWoVcwDFEeWt3cohpcF8rA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WWoVdADFEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_WWnuYQDFEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Association" href="design.uml#_WWQiAADFEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_WWnuYgDFEeWt3cohpcF8rA" points="[0, 32, -88, -20]$[88, 32, 0, -20]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WXVgEADFEeWt3cohpcF8rA" id="(1.0,0.13)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WXVgEQDFEeWt3cohpcF8rA" id="(0.0,0.67)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jIxLMADFEeWt3cohpcF8rA" type="4002" source="_VNuzsADFEeWt3cohpcF8rA" target="_ny2xMADEEeWt3cohpcF8rA" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jIxyQADFEeWt3cohpcF8rA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jIxyQQDFEeWt3cohpcF8rA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_jIxLMQDFEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_jIihsADFEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jIxLMgDFEeWt3cohpcF8rA" points="[-2, 0, 8, 72]$[-2, -72, 8, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jJeV0ADFEeWt3cohpcF8rA" id="(0.5254237288135594,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jJeV0QDFEeWt3cohpcF8rA" id="(0.43023255813953487,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_Nnha0ADGEeWt3cohpcF8rA" type="4001" source="_HIEEEADGEeWt3cohpcF8rA" target="_ISq2AADGEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_NniB4ADGEeWt3cohpcF8rA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NniB4QDGEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NniB4gDGEeWt3cohpcF8rA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NniB4wDGEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NniB5ADGEeWt3cohpcF8rA" visible="false" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NniB5QDGEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NniB5gDGEeWt3cohpcF8rA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NniB5wDGEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NniB6ADGEeWt3cohpcF8rA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NniB6QDGEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Nnio8ADGEeWt3cohpcF8rA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Nnio8QDGEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_Nnha0QDGEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Association" href="design.uml#_NnC5sADGEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Nnha0gDGEeWt3cohpcF8rA" points="[24, -1, -114, -19]$[132, -32, -6, -50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Nog5UADGEeWt3cohpcF8rA" id="(1.0,0.28)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Nog5UQDGEeWt3cohpcF8rA" id="(0.0,0.31)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_VrRO0ADGEeWt3cohpcF8rA" type="4007" source="_sV4F4ADDEeWt3cohpcF8rA" target="_ISq2AADGEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_VrRO0wDGEeWt3cohpcF8rA" type="6016">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VrRO1ADGEeWt3cohpcF8rA" x="10" y="-31"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_VrRO1QDGEeWt3cohpcF8rA" type="6017">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VrR14ADGEeWt3cohpcF8rA" x="-4" y="21"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_VrRO0QDGEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Usage" href="design.uml#_Vq2_IADGEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_VrRO0gDGEeWt3cohpcF8rA" points="[13, 15, -101, -115]$[121, 109, 7, -21]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_VsMb4ADGEeWt3cohpcF8rA" id="(0.8770949720670391,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_VsMb4QDGEeWt3cohpcF8rA" id="(0.41,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jGEKkADHEeWt3cohpcF8rA" type="4001" source="_ny2xMADEEeWt3cohpcF8rA" target="_sV4F4ADDEeWt3cohpcF8rA" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jGExoADHEeWt3cohpcF8rA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jGExoQDHEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jGExogDHEeWt3cohpcF8rA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jGExowDHEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jGExpADHEeWt3cohpcF8rA" visible="false" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jGExpQDHEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jGExpgDHEeWt3cohpcF8rA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jGExpwDHEeWt3cohpcF8rA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jGExqADHEeWt3cohpcF8rA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jGExqQDHEeWt3cohpcF8rA" y="-9"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jGFYsADHEeWt3cohpcF8rA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jGFYsQDHEeWt3cohpcF8rA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_jGEKkQDHEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Association" href="design.uml#_jFlpcADHEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jGEKkgDHEeWt3cohpcF8rA" points="[0, 5, -270, 13]$[270, 5, 0, 13]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jHE3MADHEeWt3cohpcF8rA" id="(1.0,0.37)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jHE3MQDHEeWt3cohpcF8rA" id="(0.0,0.49)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_hZpaIADJEeWt3cohpcF8rA" type="PapyrusUMLClassDiagram" name="Notation Sync Classes" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_kPsaMADJEeWt3cohpcF8rA" type="2008" fillColor="12632256">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_onQ3YADJEeWt3cohpcF8rA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_onQ3YQDJEeWt3cohpcF8rA" key="QualifiedNameDepth" value="2"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kPsaMgDJEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kPtBQADJEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kPtBQQDJEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_kPtBQgDJEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_kPtBQwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_kPtBRADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_kPtBRQDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kPtBRgDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_kPtBRwDJEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_kPtBSADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_kPtBSQDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_kPtBSgDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kPtBSwDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_kPtBTADJEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_kPtBTQDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_kPtBTgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_kPtBTwDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kPtBUADJEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_sVtGwADDEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kPsaMQDJEeWt3cohpcF8rA" x="240" y="298"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_runp4ADJEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_runp4gDJEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ruoQ8ADJEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ruoQ8QDJEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ruoQ8gDJEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ruoQ8wDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ruoQ9ADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ruoQ9QDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ruoQ9gDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ruoQ9wDJEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ruoQ-ADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ruoQ-QDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ruoQ-gDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ruoQ-wDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ruoQ_ADJEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ruoQ_QDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ruoQ_gDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ruoQ_wDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ruoRAADJEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_rud44ADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_runp4QDJEeWt3cohpcF8rA" x="11" y="481"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_2uEaAADJEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_2uEaAgDJEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2uEaAwDJEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2uEaBADJEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_2uEaBQDJEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_2uEaBgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_2uEaBwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_2uEaCADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2uEaCQDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_2uEaCgDJEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_2uEaCwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_2uEaDADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_2uEaDQDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2uEaDgDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_2uEaDwDJEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_2uEaEADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_2uEaEQDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_2uEaEgDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2uEaEwDJEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_2t6pAADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2uEaAQDJEeWt3cohpcF8rA" x="187" y="481"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_7_nMIADJEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_7_nMIgDJEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_7_nMIwDJEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_7_nMJADJEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_7_nMJQDJEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_7_nMJgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_7_nMJwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_7_nMKADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7_nMKQDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_7_nzMADJEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_7_nzMQDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_7_nzMgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_7_nzMwDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7_nzNADJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_7_nzNQDJEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_7_nzNgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_7_nzNwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_7_nzOADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7_nzOQDJEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_7_dbIADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7_nMIQDJEeWt3cohpcF8rA" x="345" y="481"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_9TEYEADJEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_9TEYEgDJEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_9TEYEwDJEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_9TEYFADJEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_9TE_IADJEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_9TE_IQDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_9TE_IgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_9TE_IwDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9TE_JADJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_9TE_JQDJEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_9TE_JgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_9TE_JwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_9TE_KADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9TE_KQDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_9TE_KgDJEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_9TE_KwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_9TE_LADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_9TE_LQDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9TE_LgDJEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_9S6nEADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9TEYEQDJEeWt3cohpcF8rA" x="501" y="481"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__13E8ADJEeWt3cohpcF8rA" type="2008" fillColor="12632256">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_DOi4AADKEeWt3cohpcF8rA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_DOi4AQDKEeWt3cohpcF8rA" key="QualifiedNameDepth" value="2"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="__13sAADJEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="__13sAQDJEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__13sAgDJEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__13sAwDJEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__13sBADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__13sBQDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__13sBgDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__13sBwDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__13sCADJEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__13sCQDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__13sCgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__13sCwDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__13sDADJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__13sDQDJEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__13sDgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__13sDwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__13sEADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__13sEQDJEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_jJG-4ADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__13E8QDJEeWt3cohpcF8rA" x="331" y="17"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__2PfcADJEeWt3cohpcF8rA" type="2008" fillColor="12632256">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_DOjfEADKEeWt3cohpcF8rA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_DOjfEQDKEeWt3cohpcF8rA" key="QualifiedNameDepth" value="2"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="__2PfcgDJEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="__2PfcwDJEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__2QGgADJEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__2QGgQDJEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__2QGggDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__2QGgwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__2QGhADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__2QGhQDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__2QGhgDJEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__2QGhwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__2QGiADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__2QGiQDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__2QGigDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__2QGiwDJEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__2QGjADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__2QGjQDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__2QGjgDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__2QGjwDJEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_jW6KUADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__2PfcQDJEeWt3cohpcF8rA" x="535" y="17"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__2ohAADJEeWt3cohpcF8rA" type="2008" fillColor="12632256">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_DOjfEgDKEeWt3cohpcF8rA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_DOjfEwDKEeWt3cohpcF8rA" key="QualifiedNameDepth" value="2"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="__2ohAgDJEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="__2ohAwDJEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__2ohBADJEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__2pIEADJEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__2pIEQDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__2pIEgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__2pIEwDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__2pIFADJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__2pIFQDJEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__2pIFgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__2pIFwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__2pIGADJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__2pIGQDJEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__2pIGgDJEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__2pIGwDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__2pIHADJEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__2pIHQDJEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__2pIHgDJEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_kHf5wADEEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__2ohAQDJEeWt3cohpcF8rA" x="105" y="17"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_aB-zkADKEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_aB-zkgDKEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_aB-zkwDKEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_aB-zlADKEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_aB_aoADKEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_aB_aoQDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_aB_aogDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_aB_aowDKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aB_apADKEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_aB_apQDKEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_aB_apgDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_aB_apwDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_aB_aqADKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aB_aqQDKEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_aB_aqgDKEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_aB_aqwDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_aB_arADKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_aB_arQDKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aB_argDKEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_aB0bgADKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aB-zkQDKEeWt3cohpcF8rA" x="111" y="163"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_bPRGEADKEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_bPRGEgDKEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_bPRGEwDKEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_bPRGFADKEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_bPRGFQDKEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_bPRGFgDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_bPRGFwDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_bPRGGADKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bPRGGQDKEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_bPRGGgDKEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_bPRGGwDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_bPRGHADKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_bPRGHQDKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bPRGHgDKEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_bPRGHwDKEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_bPRGIADKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_bPRGIQDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_bPRGIgDKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bPRGIwDKEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_bPHVEADKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bPRGEQDKEeWt3cohpcF8rA" x="347" y="163"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ccJv8ADKEeWt3cohpcF8rA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ccKXAADKEeWt3cohpcF8rA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ccKXAQDKEeWt3cohpcF8rA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ccKXAgDKEeWt3cohpcF8rA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ccKXAwDKEeWt3cohpcF8rA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ccKXBADKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ccKXBQDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ccKXBgDKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ccKXBwDKEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ccKXCADKEeWt3cohpcF8rA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ccKXCQDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ccKXCgDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ccKXCwDKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ccKXDADKEeWt3cohpcF8rA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ccKXDQDKEeWt3cohpcF8rA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ccKXDgDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ccKXDwDKEeWt3cohpcF8rA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ccKXEADKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ccKXEQDKEeWt3cohpcF8rA"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_ccAmAADKEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ccJv8QDKEeWt3cohpcF8rA" x="550" y="163"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_kuGeMAMeEeWWbMjTqzYc1A" type="2008" fillColor="12632256">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_na_iQAMeEeWWbMjTqzYc1A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_na_iQQMeEeWWbMjTqzYc1A" key="QualifiedNameDepth" value="2"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kuHFQAMeEeWWbMjTqzYc1A" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kuHFQQMeEeWWbMjTqzYc1A" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kuHFQgMeEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_kuHFQwMeEeWWbMjTqzYc1A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_kuHFRAMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_kuHFRQMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_kuHFRgMeEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kuHFRwMeEeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_kuHFSAMeEeWWbMjTqzYc1A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_kuHFSQMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_kuHFSgMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_kuHFSwMeEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kuHFTAMeEeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_kuHFTQMeEeWWbMjTqzYc1A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_kuHFTgMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_kuHFTwMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_kuHFUAMeEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kuHFUQMeEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_IShFAADGEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kuGeMQMeEeWWbMjTqzYc1A" x="750" y="294"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_omQbgAMeEeWWbMjTqzYc1A" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_omQbggMeEeWWbMjTqzYc1A" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_omQbgwMeEeWWbMjTqzYc1A" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_omQbhAMeEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_omQbhQMeEeWWbMjTqzYc1A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_omQbhgMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_omQbhwMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_omQbiAMeEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_omQbiQMeEeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_omQbigMeEeWWbMjTqzYc1A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_omQbiwMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_omQbjAMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_omQbjQMeEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_omQbjgMeEeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_omQbjwMeEeWWbMjTqzYc1A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_omQbkAMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_omQbkQMeEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_omQbkgMeEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_omQbkwMeEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_omByAAMeEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_omQbgQMeEeWWbMjTqzYc1A" x="673" y="483"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_CU15kAMfEeWWbMjTqzYc1A" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_CU15kgMfEeWWbMjTqzYc1A" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CU2goAMfEeWWbMjTqzYc1A" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CU2goQMfEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CU2gogMfEeWWbMjTqzYc1A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CU2gowMfEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CU2gpAMfEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CU2gpQMfEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CU2gpgMfEeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CU2gpwMfEeWWbMjTqzYc1A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CU2gqAMfEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CU2gqQMfEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CU2gqgMfEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CU2gqwMfEeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CU2grAMfEeWWbMjTqzYc1A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CU2grQMfEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CU2grgMfEeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CU2grwMfEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CU2gsAMfEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#__ruiQAMeEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CU15kQMfEeWWbMjTqzYc1A" x="843" y="483"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_8MwCgAM1EeWWbMjTqzYc1A" type="2008" fillColor="12632256">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="__USbMAM1EeWWbMjTqzYc1A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="__USbMQM1EeWWbMjTqzYc1A" key="QualifiedNameDepth" value="2"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_8MwpkAM1EeWWbMjTqzYc1A" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_8MwpkQM1EeWWbMjTqzYc1A" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_8MwpkgM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8MwpkwM1EeWWbMjTqzYc1A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8MwplAM1EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8MwplQM1EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8MwplgM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8MwplwM1EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8MwpmAM1EeWWbMjTqzYc1A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8MwpmQM1EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8MwpmgM1EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8MwpmwM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8MwpnAM1EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8MwpnQM1EeWWbMjTqzYc1A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8MwpngM1EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8MwpnwM1EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8MwpoAM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8MwpoQM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_v56UsADAEeWt3cohpcF8rA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8MwCgQM1EeWWbMjTqzYc1A" x="779" y="17"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ANKj8AM2EeWWbMjTqzYc1A" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ANKj8gM2EeWWbMjTqzYc1A" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ANKj8wM2EeWWbMjTqzYc1A" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ANKj9AM2EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ANKj9QM2EeWWbMjTqzYc1A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ANKj9gM2EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ANKj9wM2EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ANKj-AM2EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ANKj-QM2EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ANKj-gM2EeWWbMjTqzYc1A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ANKj-wM2EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ANKj_AM2EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ANKj_QM2EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ANKj_gM2EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ANKj_wM2EeWWbMjTqzYc1A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ANKkAAM2EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ANKkAQM2EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ANKkAgM2EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ANKkAwM2EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_ANAy8AM2EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ANKj8QM2EeWWbMjTqzYc1A" x="776" y="169"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_hZpaIQDJEeWt3cohpcF8rA" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_hZpaIgDJEeWt3cohpcF8rA"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_hZpaIwDJEeWt3cohpcF8rA">
+ <owner xmi:type="uml:Package" href="design.uml#_hKj4QACoEeWnE_cMzyyIKA"/>
+ </styles>
+ <element xmi:type="uml:Package" href="design.uml#_hKj4QACoEeWnE_cMzyyIKA"/>
+ <edges xmi:type="notation:Connector" xmi:id="_K2lAYADKEeWt3cohpcF8rA" type="4002" source="_runp4ADJEeWt3cohpcF8rA" target="_kPsaMADJEeWt3cohpcF8rA" routing="Tree">
+ <children xmi:type="notation:DecorationNode" xmi:id="_K2lAYwDKEeWt3cohpcF8rA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_K2lAZADKEeWt3cohpcF8rA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_K2lAYQDKEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_K2ZaMADKEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_K2lAYgDKEeWt3cohpcF8rA" points="[-74, -9, -179, 83]$[-74, -60, -179, 32]$[141, -60, 36, 32]$[141, -92, 36, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_K3JBEADKEeWt3cohpcF8rA" id="(1.0,0.09)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_K3JBEQDKEeWt3cohpcF8rA" id="(0.23741007194244604,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_LRaiQADKEeWt3cohpcF8rA" type="4002" source="_2uEaAADJEeWt3cohpcF8rA" target="_kPsaMADJEeWt3cohpcF8rA" routing="Tree">
+ <children xmi:type="notation:DecorationNode" xmi:id="_LRaiQwDKEeWt3cohpcF8rA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LRaiRADKEeWt3cohpcF8rA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_LRaiQQDKEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_LROVAADKEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_LRaiQgDKEeWt3cohpcF8rA" points="[0, 0, -37, 83]$[0, -51, -37, 32]$[81, -51, 44, 32]$[81, -83, 44, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_LR-i8ADKEeWt3cohpcF8rA" id="(0.2907801418439716,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_LR-i8QDKEeWt3cohpcF8rA" id="(0.17985611510791366,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_LrfPIADKEeWt3cohpcF8rA" type="4002" source="_7_nMIADJEeWt3cohpcF8rA" target="_kPsaMADJEeWt3cohpcF8rA" routing="Tree">
+ <children xmi:type="notation:DecorationNode" xmi:id="_LrfPIwDKEeWt3cohpcF8rA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LrfPJADKEeWt3cohpcF8rA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_LrfPIQDKEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_LrTB4ADKEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_LrfPIgDKEeWt3cohpcF8rA" points="[-2, -3, 68, 102]$[-61, -86, 9, 19]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_LsD24ADKEeWt3cohpcF8rA" id="(0.35294117647058826,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_LsD24QDKEeWt3cohpcF8rA" id="(0.697841726618705,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_MEp9EADKEeWt3cohpcF8rA" type="4002" source="_9TEYEADJEeWt3cohpcF8rA" target="_kPsaMADJEeWt3cohpcF8rA" routing="Tree">
+ <children xmi:type="notation:DecorationNode" xmi:id="_MEp9EwDKEeWt3cohpcF8rA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_MEp9FADKEeWt3cohpcF8rA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_MEp9EQDKEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_MEdIwADKEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_MEp9EgDKEeWt3cohpcF8rA" points="[-24, -12, 205, 107]$[-216, -95, 13, 24]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_MFUEYADKEeWt3cohpcF8rA" id="(0.29411764705882354,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_MFUEYQDKEeWt3cohpcF8rA" id="(0.49640287769784175,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_g6SIIADKEeWt3cohpcF8rA" type="4002" source="_ccJv8ADKEeWt3cohpcF8rA" target="__2PfcADJEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_g6SvMADKEeWt3cohpcF8rA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_g6SvMQDKEeWt3cohpcF8rA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_g6SIIQDKEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_g5kWcADKEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_g6SIIgDKEeWt3cohpcF8rA" points="[4, -11, -12, 114]$[-10, -75, -26, 50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_g7ELQADKEeWt3cohpcF8rA" id="(0.4,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_g7EyUADKEeWt3cohpcF8rA" id="(0.39568345323741005,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_hY4vsADKEeWt3cohpcF8rA" type="4002" source="_bPRGEADKEeWt3cohpcF8rA" target="__13E8ADJEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_hY5WwADKEeWt3cohpcF8rA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_hY5WwQDKEeWt3cohpcF8rA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_hY4vsQDKEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_hYnp8ADKEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_hY4vsgDKEeWt3cohpcF8rA" points="[-5, -50, -3, 114]$[-5, -114, -3, 50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hZdXcADKEeWt3cohpcF8rA" id="(0.4818181818181818,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hZdXcQDKEeWt3cohpcF8rA" id="(0.49640287769784175,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_h0a1IADKEeWt3cohpcF8rA" type="4002" source="_aB-zkADKEeWt3cohpcF8rA" target="__2ohAADJEeWt3cohpcF8rA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_h0bcMADKEeWt3cohpcF8rA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_h0bcMQDKEeWt3cohpcF8rA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_h0a1IQDKEeWt3cohpcF8rA"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_h0K9gADKEeWt3cohpcF8rA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_h0a1IgDKEeWt3cohpcF8rA" points="[0, -21, 1, 114]$[0, -85, 1, 50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_h10jUADKEeWt3cohpcF8rA" id="(0.5517241379310345,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_h10jUQDKEeWt3cohpcF8rA" id="(0.5035971223021583,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_JXjHUAMfEeWWbMjTqzYc1A" type="4002" source="_omQbgAMeEeWWbMjTqzYc1A" target="_kuGeMAMeEeWWbMjTqzYc1A" routing="Tree">
+ <children xmi:type="notation:DecorationNode" xmi:id="_JXjuYAMfEeWWbMjTqzYc1A" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_JXjuYQMfEeWWbMjTqzYc1A" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_JXjHUQMfEeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_JXKFwAMfEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_JXjHUgMfEeWWbMjTqzYc1A" points="[3, -11, -38, 111]$[34, -100, -7, 22]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_JYoFYAMfEeWWbMjTqzYc1A" id="(0.6622516556291391,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_JYoscAMfEeWWbMjTqzYc1A" id="(0.381294964028777,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_Jz5FEAMfEeWWbMjTqzYc1A" type="4002" source="_CU15kAMfEeWWbMjTqzYc1A" target="_kuGeMAMeEeWWbMjTqzYc1A" routing="Tree">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Jz5FEwMfEeWWbMjTqzYc1A" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Jz5sIAMfEeWWbMjTqzYc1A" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_Jz5FEQMfEeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_Jzjt4AMfEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Jz5FEgMfEeWWbMjTqzYc1A" points="[-26, -50, 65, 139]$[-85, -139, 6, 50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_J0oE4AMfEeWWbMjTqzYc1A" id="(0.43283582089552236,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_J0oE4QMfEeWWbMjTqzYc1A" id="(0.6546762589928058,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_CT61EAM2EeWWbMjTqzYc1A" type="4002" source="_ANKj8AM2EeWWbMjTqzYc1A" target="_8MwCgAM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_CT7cIAM2EeWWbMjTqzYc1A" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CT7cIQM2EeWWbMjTqzYc1A" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_CT61EQM2EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Generalization" href="design.uml#_CS6vgAM2EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CT61EgM2EeWWbMjTqzYc1A" points="[-7, -14, -8, 95]$[-7, -159, -8, -50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_CU_MEAM2EeWWbMjTqzYc1A" id="(0.5034013605442177,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_CU_MEQM2EeWWbMjTqzYc1A" id="(0.46405228758169936,1.0)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_NrAiYALkEeWy2L7kEYTJVw" type="CompositeStructure" name="Synchronization" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_NrAiYQLkEeWy2L7kEYTJVw" type="2075">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_g3PQQALwEeW1-e4oerqxMg" source="PapyrusHyperLink_Page" references="_zXyJYALnEeW1-e4oerqxMg">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_g3PQQQLwEeW1-e4oerqxMg" key="tooltip_text" value="Synchronize Model Elements"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_g3PQQgLwEeW1-e4oerqxMg" key="pageName" value="Synchronize Model Elements"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_g3PQQwLwEeW1-e4oerqxMg" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NrAiYgLkEeWy2L7kEYTJVw" type="5158"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NrAiYwLkEeWy2L7kEYTJVw" type="6090">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NrAiZALkEeWy2L7kEYTJVw" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_NrAiZQLkEeWy2L7kEYTJVw" type="7075">
+ <children xmi:type="notation:Shape" xmi:id="_Sm-GEALkEeWy2L7kEYTJVw" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Sm-tIALkEeWy2L7kEYTJVw" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Sm-tIQLkEeWy2L7kEYTJVw" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Sm-tIgLkEeWy2L7kEYTJVw" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Sm-tIwLkEeWy2L7kEYTJVw" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Sm-tJALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Sm-tJQLkEeWy2L7kEYTJVw"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_SmVz8ALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Sm-GEQLkEeWy2L7kEYTJVw" x="46" y="34"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_U9_AwALkEeWy2L7kEYTJVw" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_U9_n0ALkEeWy2L7kEYTJVw" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_U9_n0QLkEeWy2L7kEYTJVw" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_U9_n0gLkEeWy2L7kEYTJVw" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_U9_n0wLkEeWy2L7kEYTJVw" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_U9_n1ALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U9_n1QLkEeWy2L7kEYTJVw"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_U96IQALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U9_AwQLkEeWy2L7kEYTJVw" x="44" y="123"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XQrcIALkEeWy2L7kEYTJVw" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XQsDMALkEeWy2L7kEYTJVw" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XQsDMQLkEeWy2L7kEYTJVw" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XQsDMgLkEeWy2L7kEYTJVw" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XQsDMwLkEeWy2L7kEYTJVw" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_XQsDNALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XQsDNQLkEeWy2L7kEYTJVw"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_XQkHYALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XQrcIQLkEeWy2L7kEYTJVw" x="399" y="240"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_X-qjgALkEeWy2L7kEYTJVw" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_X-qjggLkEeWy2L7kEYTJVw" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_X-qjgwLkEeWy2L7kEYTJVw" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_X-qjhALkEeWy2L7kEYTJVw" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_X-qjhQLkEeWy2L7kEYTJVw" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_X-qjhgLkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_X-qjhwLkEeWy2L7kEYTJVw"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_X-insALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_X-qjgQLkEeWy2L7kEYTJVw" x="326" y="24"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Ye-bQALkEeWy2L7kEYTJVw" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Ye-bQgLkEeWy2L7kEYTJVw" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Ye-bQwLkEeWy2L7kEYTJVw" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Ye-bRALkEeWy2L7kEYTJVw" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Ye-bRQLkEeWy2L7kEYTJVw" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Ye-bRgLkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ye-bRwLkEeWy2L7kEYTJVw"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_Ye1RUALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ye-bQQLkEeWy2L7kEYTJVw" x="325" y="140"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Y6boMALkEeWy2L7kEYTJVw" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Y6cPQALkEeWy2L7kEYTJVw" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Y6cPQQLkEeWy2L7kEYTJVw" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Y6cPQgLkEeWy2L7kEYTJVw" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Y6cPQwLkEeWy2L7kEYTJVw" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Y6cPRALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Y6cPRQLkEeWy2L7kEYTJVw"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_Y53ngALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Y6boMQLkEeWy2L7kEYTJVw" x="163" y="241"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_NrAiZgLkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NrAiZwLkEeWy2L7kEYTJVw"/>
+ </children>
+ <element xmi:type="uml:Collaboration" href="design.uml#_FNBpcALkEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NrAiaALkEeWy2L7kEYTJVw" x="40" y="40" width="670" height="377"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_NrAiaQLkEeWy2L7kEYTJVw" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_NrAiagLkEeWy2L7kEYTJVw"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_NrAiawLkEeWy2L7kEYTJVw">
+ <owner xmi:type="uml:Collaboration" href="design.uml#_FNBpcALkEeWy2L7kEYTJVw"/>
+ </styles>
+ <element xmi:type="uml:Collaboration" href="design.uml#_FNBpcALkEeWy2L7kEYTJVw"/>
+ <edges xmi:type="notation:Connector" xmi:id="_guASMALkEeWy2L7kEYTJVw" type="4013" source="_Sm-GEALkEeWy2L7kEYTJVw" target="_U9_AwALkEeWy2L7kEYTJVw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_guA5QALkEeWy2L7kEYTJVw" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_guA5QQLkEeWy2L7kEYTJVw" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_guA5QgLkEeWy2L7kEYTJVw" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_guA5QwLkEeWy2L7kEYTJVw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_guA5RALkEeWy2L7kEYTJVw" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_guA5RQLkEeWy2L7kEYTJVw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_guA5RgLkEeWy2L7kEYTJVw" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_guA5RwLkEeWy2L7kEYTJVw" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_guASMQLkEeWy2L7kEYTJVw"/>
+ <element xmi:type="uml:Connector" href="design.uml#_gtxBoALkEeWy2L7kEYTJVw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_guASMgLkEeWy2L7kEYTJVw" points="[-7, 23, -13, -66]$[-82, 80, -88, -9]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gurnoALkEeWy2L7kEYTJVw" id="(0.43125,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gurnoQLkEeWy2L7kEYTJVw" id="(0.4011299435028249,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_if34cALkEeWy2L7kEYTJVw" type="4013" source="_X-qjgALkEeWy2L7kEYTJVw" target="_Ye-bQALkEeWy2L7kEYTJVw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_if34cwLkEeWy2L7kEYTJVw" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_if34dALkEeWy2L7kEYTJVw" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_if34dQLkEeWy2L7kEYTJVw" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_if34dgLkEeWy2L7kEYTJVw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_if34dwLkEeWy2L7kEYTJVw" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_if34eALkEeWy2L7kEYTJVw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_if4fgALkEeWy2L7kEYTJVw" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_if4fgQLkEeWy2L7kEYTJVw" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_if34cQLkEeWy2L7kEYTJVw"/>
+ <element xmi:type="uml:Connector" href="design.uml#_ifsSQALkEeWy2L7kEYTJVw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_if34cgLkEeWy2L7kEYTJVw" points="[-9, 23, 0, -75]$[-10, 93, -1, -5]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_igcgMALkEeWy2L7kEYTJVw" id="(0.449438202247191,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_igcgMQLkEeWy2L7kEYTJVw" id="(0.48502994011976047,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jLMtYALkEeWy2L7kEYTJVw" type="4013" source="_Ye-bQALkEeWy2L7kEYTJVw" target="_Y6boMALkEeWy2L7kEYTJVw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jLNUcALkEeWy2L7kEYTJVw" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jLNUcQLkEeWy2L7kEYTJVw" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jLNUcgLkEeWy2L7kEYTJVw" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jLNUcwLkEeWy2L7kEYTJVw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jLNUdALkEeWy2L7kEYTJVw" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jLNUdQLkEeWy2L7kEYTJVw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jLNUdgLkEeWy2L7kEYTJVw" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jLNUdwLkEeWy2L7kEYTJVw" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_jLMtYQLkEeWy2L7kEYTJVw"/>
+ <element xmi:type="uml:Connector" href="design.uml#_jKlpYALkEeWy2L7kEYTJVw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jLMtYgLkEeWy2L7kEYTJVw" points="[-40, 23, 119, -78]$[-165, 78, -6, -23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jLscoALkEeWy2L7kEYTJVw" id="(0.281437125748503,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jLscoQLkEeWy2L7kEYTJVw" id="(0.6395348837209303,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jzUdUALkEeWy2L7kEYTJVw" type="4013" source="_Ye-bQALkEeWy2L7kEYTJVw" target="_XQrcIALkEeWy2L7kEYTJVw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jzUdUwLkEeWy2L7kEYTJVw" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jzUdVALkEeWy2L7kEYTJVw" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jzUdVQLkEeWy2L7kEYTJVw" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jzUdVgLkEeWy2L7kEYTJVw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jzVEYALkEeWy2L7kEYTJVw" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jzVEYQLkEeWy2L7kEYTJVw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jzVEYgLkEeWy2L7kEYTJVw" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jzVEYwLkEeWy2L7kEYTJVw" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_jzUdUQLkEeWy2L7kEYTJVw"/>
+ <element xmi:type="uml:Connector" href="design.uml#_jzDXkALkEeWy2L7kEYTJVw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jzUdUgLkEeWy2L7kEYTJVw" points="[16, 23, -47, -77]$[66, 77, 3, -23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jz8vcALkEeWy2L7kEYTJVw" id="(0.718562874251497,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jz8vcQLkEeWy2L7kEYTJVw" id="(0.4652777777777778,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_gIF6YAM0EeWWbMjTqzYc1A" type="4013" source="_U9_AwALkEeWy2L7kEYTJVw" target="_Y6boMALkEeWy2L7kEYTJVw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_gIF6YwM0EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gIF6ZAM0EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gIF6ZQM0EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gIF6ZgM0EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gIGhcAM0EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gIGhcQM0EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gIGhcgM0EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gIGhcwM0EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_gIF6YQM0EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_gH8wcAM0EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gIF6YgM0EeWWbMjTqzYc1A" points="[13, 20, -104, -98]$[31, 113, -86, -5]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gIdt0AM0EeWWbMjTqzYc1A" id="(0.615819209039548,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gIdt0QM0EeWWbMjTqzYc1A" id="(0.20930232558139536,0.0)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_zXyJYALnEeW1-e4oerqxMg" type="PapyrusUMLCommunicationDiagram" name="Synchronize Model Elements" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_zXyJYQLnEeW1-e4oerqxMg" type="8002">
+ <children xmi:type="notation:DecorationNode" xmi:id="_zXyJYgLnEeW1-e4oerqxMg" type="5001"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_zXyJYwLnEeW1-e4oerqxMg" type="6013">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zXyJZALnEeW1-e4oerqxMg" x="50"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_zXyJZQLnEeW1-e4oerqxMg" type="7001">
+ <children xmi:type="notation:Shape" xmi:id="_A4rtIALpEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_A4sUMALpEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_A4sUMQLpEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_A4sUMgLpEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_A4nbsALpEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_A4rtIQLpEeW1-e4oerqxMg" x="81" y="38"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_xO6mIALsEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_xO7NMALsEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_xO7NMQLsEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xO7NMgLsEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_xO2UsALsEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xO6mIQLsEeW1-e4oerqxMg" x="340" y="43"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_QVDXsALtEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_QVDXsgLtEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_QVDXswLtEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QVDXtALtEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_QU94IALtEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QVDXsQLtEeW1-e4oerqxMg" x="75" y="124"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_J_QoYALvEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_J_RPcALvEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_J_RPcQLvEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_J_RPcgLvEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_J_Cl8ALvEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_J_QoYQLvEeW1-e4oerqxMg" x="89" y="251"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_P6ScYALvEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_P6TDcALvEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_P6TDcQLvEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_P6TDcgLvEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_P5ytIALvEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_P6ScYQLvEeW1-e4oerqxMg" x="346" y="199"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Rhqp4ALvEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Rhqp4gLvEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Rhqp4wLvEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Rhqp5ALvEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_Rhhf8ALvEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Rhqp4QLvEeW1-e4oerqxMg" x="336" y="299"/>
+ </children>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zXyJZgLnEeW1-e4oerqxMg"/>
+ </children>
+ <element xmi:type="uml:Interaction" href="design.uml#_mC8rsALmEeWy2L7kEYTJVw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zXyJZwLnEeW1-e4oerqxMg" width="592" height="401"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_zXyJaALnEeW1-e4oerqxMg" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_zXyJaQLnEeW1-e4oerqxMg"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_zXyJagLnEeW1-e4oerqxMg">
+ <owner xmi:type="uml:Interaction" href="design.uml#_mC8rsALmEeWy2L7kEYTJVw"/>
+ </styles>
+ <element xmi:type="uml:Interaction" href="design.uml#_mC8rsALmEeWy2L7kEYTJVw"/>
+ <edges xmi:type="notation:Connector" xmi:id="_ZV73cALvEeW1-e4oerqxMg" type="8009" source="_A4rtIALpEeW1-e4oerqxMg" target="_xO6mIALsEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ZV8egALvEeW1-e4oerqxMg" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_ZUlMkALvEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ZV8egQLvEeW1-e4oerqxMg" x="1" y="-23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ZV8eggLvEeW1-e4oerqxMg" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ZV8egwLvEeW1-e4oerqxMg" x="1" y="-53"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3R1DcALvEeW1-e4oerqxMg" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_3RFckALvEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3R1DcQLvEeW1-e4oerqxMg" x="-7" y="16"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_ZV73cQLvEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ZV73cgLvEeW1-e4oerqxMg" points="[60, 7, -203, 2]$[200, 7, -63, 2]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_dusAYALvEeW1-e4oerqxMg" type="8009" source="_xO6mIALsEeW1-e4oerqxMg" target="_P6ScYALvEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_dusncALvEeW1-e4oerqxMg" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_dttI8ALvEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_dusncQLvEeW1-e4oerqxMg" x="-5" y="23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_dusncgLvEeW1-e4oerqxMg" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_dusncwLvEeW1-e4oerqxMg" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_dusAYQLvEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_dusAYgLvEeW1-e4oerqxMg" points="[-1, 13, 13, -178]$[-14, 188, 0, -3]"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_dvAwgALvEeW1-e4oerqxMg" id="(0.512396694214876,0.12)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_pBgYcALvEeW1-e4oerqxMg" type="8009" source="_xO6mIALsEeW1-e4oerqxMg" target="_J_QoYALvEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_pBgYcwLvEeW1-e4oerqxMg" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_pAz04ALvEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_pBg_gALvEeW1-e4oerqxMg" x="-10" y="39"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_pBg_gQLvEeW1-e4oerqxMg" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_pBg_ggLvEeW1-e4oerqxMg" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_pBgYcQLvEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_pBgYcgLvEeW1-e4oerqxMg" points="[-15, 6, 92, -41]$[-86, 44, 21, -3]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_pBz6cALvEeW1-e4oerqxMg" id="(0.29365079365079366,0.24)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_pBz6cQLvEeW1-e4oerqxMg" id="(0.7844827586206896,0.44)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_rsCsEALvEeW1-e4oerqxMg" type="8009" source="_P6ScYALvEeW1-e4oerqxMg" target="_Rhqp4ALvEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_rsDTIALvEeW1-e4oerqxMg" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_rrYkwALvEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rsDTIQLvEeW1-e4oerqxMg" x="-9" y="33"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_rsDTIgLvEeW1-e4oerqxMg" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rsDTIwLvEeW1-e4oerqxMg" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_rsCsEQLvEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_rsCsEgLvEeW1-e4oerqxMg" points="[17, 7, -97, -46]$[94, 56, -20, 3]"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_rsXcMQLvEeW1-e4oerqxMg" id="(0.63,0.2)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_vuGMQALvEeW1-e4oerqxMg" type="8009" source="_J_QoYALvEeW1-e4oerqxMg" target="_QVDXsALtEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_vuGMQwLvEeW1-e4oerqxMg" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_vta20ALvEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vuGMRALvEeW1-e4oerqxMg" x="21" y="-23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_vuGzUALvEeW1-e4oerqxMg" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vuGzUQLvEeW1-e4oerqxMg" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_vuGMQQLvEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_vuGMQgLvEeW1-e4oerqxMg" points="[-6, -12, 57, 115]$[-53, -114, 10, 13]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_fq-9EAMzEeWWbMjTqzYc1A" type="8009" source="_J_QoYALvEeW1-e4oerqxMg" target="_P6ScYALvEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_fq-9EwMzEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_fp27sAMzEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_fq-9FAMzEeWWbMjTqzYc1A" x="16" y="-29"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_fq-9FQMzEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_fq-9FgMzEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_vhwBcAMzEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_vgkVsAMzEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vhwBcQMzEeWWbMjTqzYc1A" x="-21" y="23"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_fq-9EQMzEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_fq-9EgMzEeWWbMjTqzYc1A" points="[16, -5, -160, 49]$[157, -57, -19, -3]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_frTtMAMzEeWWbMjTqzYc1A" id="(0.8620689655172413,0.4)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_frTtMQMzEeWWbMjTqzYc1A" id="(0.15702479338842976,0.32)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_3_KlYAMBEeW1-e4oerqxMg" type="CompositeStructure" name="Synchronization Overrides" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_3_KlYQMBEeW1-e4oerqxMg" type="2075">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_LuzLMAMiEeWWbMjTqzYc1A" source="PapyrusHyperLink_Page" references="_3_NosAMBEeW1-e4oerqxMg">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LuzLMQMiEeWWbMjTqzYc1A" key="tooltip_text" value="Synchronization Overrides"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LuzLMgMiEeWWbMjTqzYc1A" key="pageName" value="Synchronization Overrides"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LuzLMwMiEeWWbMjTqzYc1A" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMcgMBEeW1-e4oerqxMg" type="5158"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMcwMBEeW1-e4oerqxMg" type="6090">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMdAMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3_LMdQMBEeW1-e4oerqxMg" type="7075">
+ <children xmi:type="notation:Shape" xmi:id="_3_LMdgMBEeW1-e4oerqxMg" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMdwMBEeW1-e4oerqxMg" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMeAMBEeW1-e4oerqxMg" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMeQMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3_LMegMBEeW1-e4oerqxMg" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_3_LMewMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMfAMBEeW1-e4oerqxMg"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_3_HiEQMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMgAMBEeW1-e4oerqxMg" x="289" y="32"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3_LMgQMBEeW1-e4oerqxMg" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMggMBEeW1-e4oerqxMg" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMgwMBEeW1-e4oerqxMg" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMhAMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3_LMhQMBEeW1-e4oerqxMg" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_3_LMhgMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMhwMBEeW1-e4oerqxMg"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_3_HiEgMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMiwMBEeW1-e4oerqxMg" x="288" y="123"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3_LMjAMBEeW1-e4oerqxMg" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMjQMBEeW1-e4oerqxMg" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMjgMBEeW1-e4oerqxMg" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMjwMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3_LMkAMBEeW1-e4oerqxMg" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_3_LMkQMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMkgMBEeW1-e4oerqxMg"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_3_HiFQMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMlgMBEeW1-e4oerqxMg" x="20" y="230"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3_LMlwMBEeW1-e4oerqxMg" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMmAMBEeW1-e4oerqxMg" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMmQMBEeW1-e4oerqxMg" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMmgMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3_LMmwMBEeW1-e4oerqxMg" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_3_LMnAMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMnQMBEeW1-e4oerqxMg"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_3_HiGAMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMoQMBEeW1-e4oerqxMg" x="56" y="33"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3_LMogMBEeW1-e4oerqxMg" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMowMBEeW1-e4oerqxMg" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMpAMBEeW1-e4oerqxMg" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMpQMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3_LMpgMBEeW1-e4oerqxMg" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_3_LMpwMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMqAMBEeW1-e4oerqxMg"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_3_HiGwMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMrAMBEeW1-e4oerqxMg" x="54" y="122"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3_LMrQMBEeW1-e4oerqxMg" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMrgMBEeW1-e4oerqxMg" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMrwMBEeW1-e4oerqxMg" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMsAMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3_LMsQMBEeW1-e4oerqxMg" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_3_LMsgMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMswMBEeW1-e4oerqxMg"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_3_HiHgMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMtwMBEeW1-e4oerqxMg" x="185" y="230"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_tHh8YAMgEeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_tHijcAMgEeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_tHijcQMgEeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_tHijcgMgEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_tHijcwMgEeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_tHijdAMgEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tHijdQMgEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_tGurIAMgEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tHh8YQMgEeWWbMjTqzYc1A" x="530" y="119"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_xDVDkAMgEeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_xDVqoAMgEeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_xDVqoQMgEeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xDVqogMgEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_xDVqowMgEeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_xDVqpAMgEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xDVqpQMgEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_xDKrgAMgEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xDVDkQMgEeWWbMjTqzYc1A" x="493" y="272"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_z2yCoAMgEeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_z2yCogMgEeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_z2yCowMgEeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_z2yCpAMgEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_z2yCpQMgEeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_z2yCpgMgEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z2yCpwMgEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_z2B0sAMgEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z2yCoQMgEeWWbMjTqzYc1A" x="478" y="203"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_3_LMuAMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMuQMBEeW1-e4oerqxMg"/>
+ </children>
+ <element xmi:type="uml:Collaboration" href="design.uml#_3_HiEAMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_LMvQMBEeW1-e4oerqxMg" x="40" y="40" width="758" height="367"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_3_LMvgMBEeW1-e4oerqxMg" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_3_LMvwMBEeW1-e4oerqxMg"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_3_LMwAMBEeW1-e4oerqxMg">
+ <owner xmi:type="uml:Collaboration" href="design.uml#_3_HiEAMBEeW1-e4oerqxMg"/>
+ </styles>
+ <element xmi:type="uml:Collaboration" href="design.uml#_3_HiEAMBEeW1-e4oerqxMg"/>
+ <edges xmi:type="notation:Connector" xmi:id="_3_LMwQMBEeW1-e4oerqxMg" type="4013" source="_3_LMdgMBEeW1-e4oerqxMg" target="_3_LMgQMBEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMwgMBEeW1-e4oerqxMg" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMwwMBEeW1-e4oerqxMg" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMxAMBEeW1-e4oerqxMg" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMxQMBEeW1-e4oerqxMg" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMxgMBEeW1-e4oerqxMg" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMxwMBEeW1-e4oerqxMg" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMyAMBEeW1-e4oerqxMg" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LMyQMBEeW1-e4oerqxMg" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_3_LMygMBEeW1-e4oerqxMg"/>
+ <element xmi:type="uml:Connector" href="design.uml#_3_HiIQMBEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3_LMywMBEeW1-e4oerqxMg" points="[-7, 23, -13, -66]$[-82, 80, -88, -9]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_3_LMzAMBEeW1-e4oerqxMg" id="(0.4375,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_3_LMzQMBEeW1-e4oerqxMg" id="(0.4011299435028249,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_3_LMzgMBEeW1-e4oerqxMg" type="4013" source="_3_LMlwMBEeW1-e4oerqxMg" target="_3_LMogMBEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LMzwMBEeW1-e4oerqxMg" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM0AMBEeW1-e4oerqxMg" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM0QMBEeW1-e4oerqxMg" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM0gMBEeW1-e4oerqxMg" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM0wMBEeW1-e4oerqxMg" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM1AMBEeW1-e4oerqxMg" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM1QMBEeW1-e4oerqxMg" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM1gMBEeW1-e4oerqxMg" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_3_LM1wMBEeW1-e4oerqxMg"/>
+ <element xmi:type="uml:Connector" href="design.uml#_3_HiJAMBEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3_LM2AMBEeW1-e4oerqxMg" points="[-9, 23, 0, -75]$[-10, 93, -1, -5]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_3_LM2QMBEeW1-e4oerqxMg" id="(0.449438202247191,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_3_LM2gMBEeW1-e4oerqxMg" id="(0.48502994011976047,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_3_LM2wMBEeW1-e4oerqxMg" type="4013" source="_3_LMogMBEeW1-e4oerqxMg" target="_3_LMrQMBEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM3AMBEeW1-e4oerqxMg" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM3QMBEeW1-e4oerqxMg" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM3gMBEeW1-e4oerqxMg" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM3wMBEeW1-e4oerqxMg" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM4AMBEeW1-e4oerqxMg" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM4QMBEeW1-e4oerqxMg" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM4gMBEeW1-e4oerqxMg" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM4wMBEeW1-e4oerqxMg" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_3_LM5AMBEeW1-e4oerqxMg"/>
+ <element xmi:type="uml:Connector" href="design.uml#_3_HiJwMBEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3_LM5QMBEeW1-e4oerqxMg" points="[-40, 23, 119, -78]$[-165, 78, -6, -23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_3_LM5gMBEeW1-e4oerqxMg" id="(0.592814371257485,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_3_LM5wMBEeW1-e4oerqxMg" id="(0.6395348837209303,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_3_LM6AMBEeW1-e4oerqxMg" type="4013" source="_3_LMogMBEeW1-e4oerqxMg" target="_3_LMjAMBEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM6QMBEeW1-e4oerqxMg" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM6gMBEeW1-e4oerqxMg" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM6wMBEeW1-e4oerqxMg" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM7AMBEeW1-e4oerqxMg" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM7QMBEeW1-e4oerqxMg" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM7gMBEeW1-e4oerqxMg" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_LM7wMBEeW1-e4oerqxMg" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_LM8AMBEeW1-e4oerqxMg" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_3_LM8QMBEeW1-e4oerqxMg"/>
+ <element xmi:type="uml:Connector" href="design.uml#_3_HiKgMBEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3_LM8gMBEeW1-e4oerqxMg" points="[16, 23, -47, -77]$[66, 77, 3, -23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_cqR04AMiEeWWbMjTqzYc1A" id="(0.4311377245508982,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_3_LM9AMBEeW1-e4oerqxMg" id="(0.4652777777777778,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_F08RUAMhEeWWbMjTqzYc1A" type="4013" source="_tHh8YAMgEeWWbMjTqzYc1A" target="_z2yCoAMgEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_F084YAMhEeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_F084YQMhEeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_F084YgMhEeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_F084YwMhEeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_F084ZAMhEeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_F084ZQMhEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_F084ZgMhEeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_F084ZwMhEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_F08RUQMhEeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_F0uO4AMhEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_F08RUgMhEeWWbMjTqzYc1A" points="[-4, 23, 9, -64]$[-15, 64, -2, -23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_F1aLYAMhEeWWbMjTqzYc1A" id="(0.39226519337016574,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_F1aLYQMhEeWWbMjTqzYc1A" id="(0.4844961240310077,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_GbEdMAMhEeWWbMjTqzYc1A" type="4013" source="_z2yCoAMgEeWWbMjTqzYc1A" target="_xDVDkAMgEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_GbEdMwMhEeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GbEdNAMhEeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_GbEdNQMhEeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GbEdNgMhEeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_GbFEQAMhEeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GbFEQQMhEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_GbFEQgMhEeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GbFEQwMhEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_GbEdMQMhEeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_Ga2awAMhEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GbEdMgMhEeWWbMjTqzYc1A" points="[-3, 23, 9, -69]$[-25, 82, -13, -10]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Gbt9cAMhEeWWbMjTqzYc1A" id="(0.43023255813953487,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Gbt9cQMhEeWWbMjTqzYc1A" id="(0.4247787610619469,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_gSstEAMiEeWWbMjTqzYc1A" type="4013" source="_3_LMgQMBEeW1-e4oerqxMg" target="_tHh8YAMgEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_gStUIAMiEeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gStUIQMiEeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gStUIgMiEeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gStUIwMiEeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gStUJAMiEeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gStUJQMiEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gStUJgMiEeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gStUJwMiEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_gSstEQMiEeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_gSgf0AMiEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gSstEgMiEeWWbMjTqzYc1A" points="[34, -16, -134, 61]$[137, -74, -31, 3]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gTZQoAMiEeWWbMjTqzYc1A" id="(1.0,0.475)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gTZQoQMiEeWWbMjTqzYc1A" id="(0.0,0.575)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_KqABIAM0EeWWbMjTqzYc1A" type="4013" source="_3_LMgQMBEeW1-e4oerqxMg" target="_3_LMrQMBEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_KqAoMAM0EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KqAoMQM0EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_KqAoMgM0EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KqAoMwM0EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_KqAoNAM0EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KqAoNQM0EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_KqAoNgM0EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KqAoNwM0EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_KqABIQM0EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_KpMI0AM0EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_KqABIgM0EeWWbMjTqzYc1A" points="[-6, 9, 49, -78]$[-33, 83, 22, -4]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Kqty0AM0EeWWbMjTqzYc1A" id="(0.4180790960451977,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Kqty0QM0EeWWbMjTqzYc1A" id="(0.9069767441860465,0.0)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_3_NosAMBEeW1-e4oerqxMg" type="PapyrusUMLCommunicationDiagram" name="Synchronization Overrides" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_3_NosQMBEeW1-e4oerqxMg" type="8002">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_NosgMBEeW1-e4oerqxMg" type="5001"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_NoswMBEeW1-e4oerqxMg" type="6013">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_NotAMBEeW1-e4oerqxMg" x="50"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_3_NotQMBEeW1-e4oerqxMg" type="7001">
+ <children xmi:type="notation:Shape" xmi:id="_3_NotgMBEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_NotwMBEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_NouAMBEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_NouQMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_3_HiLgMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_NovQMBEeW1-e4oerqxMg" x="301" y="27"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3_NovgMBEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_NovwMBEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_NowAMBEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_NowQMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_3_HiLwMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_NoxQMBEeW1-e4oerqxMg" x="72" y="27"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3_NoxgMBEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_NoxwMBEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_NoyAMBEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_NoyQMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_3_HiMAMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_NozQMBEeW1-e4oerqxMg" x="259" y="141"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3_NozgMBEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_NozwMBEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_No0AMBEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_No0QMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_3_HiMQMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_No1QMBEeW1-e4oerqxMg" x="76" y="240"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3_No1gMBEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_No1wMBEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_No2AMBEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_No2QMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_3_HiMgMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_No3QMBEeW1-e4oerqxMg" x="80" y="129"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3_No3gMBEeW1-e4oerqxMg" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_No3wMBEeW1-e4oerqxMg" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_No4AMBEeW1-e4oerqxMg" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_No4QMBEeW1-e4oerqxMg" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_3_HiMwMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_No5QMBEeW1-e4oerqxMg" x="75" y="331"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_xgRMUAMiEeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_xgRzYAMiEeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_xgRzYQMiEeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xgRzYgMiEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_xgDJ4AMiEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xgRMUQMiEeWWbMjTqzYc1A" x="416" y="235"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_1GCZIAMiEeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_1GCZIgMiEeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_1GCZIwMiEeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_1GCZJAMiEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_1F52QAMiEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1GCZIQMiEeWWbMjTqzYc1A" x="410" y="371"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_6T9PgAMiEeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_6T92kAMiEeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6T92kQMiEeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6T92kgMiEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_6TzegAMiEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6T9PgQMiEeWWbMjTqzYc1A" x="235" y="337"/>
+ </children>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_No5gMBEeW1-e4oerqxMg"/>
+ </children>
+ <element xmi:type="uml:Interaction" href="design.uml#_3_HiLQMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3_No6gMBEeW1-e4oerqxMg" width="669" height="463"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_3_No6wMBEeW1-e4oerqxMg" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_3_No7AMBEeW1-e4oerqxMg"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_3_No7QMBEeW1-e4oerqxMg">
+ <owner xmi:type="uml:Interaction" href="design.uml#_3_HiLQMBEeW1-e4oerqxMg"/>
+ </styles>
+ <element xmi:type="uml:Interaction" href="design.uml#_3_HiLQMBEeW1-e4oerqxMg"/>
+ <edges xmi:type="notation:Connector" xmi:id="_3_No7gMBEeW1-e4oerqxMg" type="8009" source="_3_NotgMBEeW1-e4oerqxMg" target="_3_NovgMBEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_No7wMBEeW1-e4oerqxMg" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_3_HiQAMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_No8AMBEeW1-e4oerqxMg" x="1" y="-23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_No8QMBEeW1-e4oerqxMg" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_No8gMBEeW1-e4oerqxMg" x="1" y="-53"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_No8wMBEeW1-e4oerqxMg" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_3_HiRQMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_No9AMBEeW1-e4oerqxMg" x="2" y="24"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_3_No9QMBEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3_No9gMBEeW1-e4oerqxMg" points="[60, 7, -203, 2]$[200, 7, -63, 2]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_3_No9wMBEeW1-e4oerqxMg" type="8009" source="_3_NovgMBEeW1-e4oerqxMg" target="_3_No1gMBEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_No-AMBEeW1-e4oerqxMg" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_3_HiQQMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_No-QMBEeW1-e4oerqxMg" x="-13" y="33"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_No-gMBEeW1-e4oerqxMg" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_No-wMBEeW1-e4oerqxMg" x="1" y="-53"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-Q9dUAMyEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_-QSH4AMyEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-Q-EYAMyEeWWbMjTqzYc1A" x="-10" y="-26"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_3_No_AMBEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3_No_QMBEeW1-e4oerqxMg" points="[-1, 13, 13, -178]$[-14, 188, 0, -3]"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_3_No_gMBEeW1-e4oerqxMg" id="(0.512396694214876,0.12)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_3_OPwgMBEeW1-e4oerqxMg" type="8009" source="_3_NozgMBEeW1-e4oerqxMg" target="_3_NoxgMBEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_OPwwMBEeW1-e4oerqxMg" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_3_HiRAMBEeW1-e4oerqxMg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_OPxAMBEeW1-e4oerqxMg" x="1" y="-31"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3_OPxQMBEeW1-e4oerqxMg" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3_OPxgMBEeW1-e4oerqxMg" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_3_OPxwMBEeW1-e4oerqxMg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3_OPyAMBEeW1-e4oerqxMg" points="[-6, -12, 57, 115]$[-53, -114, 10, 13]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_O5ODUAMjEeWWbMjTqzYc1A" type="8009" source="_xgRMUAMiEeWWbMjTqzYc1A" target="_1GCZIAMiEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_O5OqYAMjEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_O3dIwAMjEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_O5OqYQMjEeWWbMjTqzYc1A" x="3" y="-32"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_O5OqYgMjEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_O5OqYwMjEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_O5ODUQMjEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_O5ODUgMjEeWWbMjTqzYc1A" points="[-9, 13, 64, -89]$[-74, 115, -1, 13]"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vSOyAAMjEeWWbMjTqzYc1A" id="(0.8425925925925926,0.28)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_V1_oMAMjEeWWbMjTqzYc1A" type="8009" source="_xgRMUAMiEeWWbMjTqzYc1A" target="_6T9PgAMiEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_V1_oMwMjEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_V1OMIAMjEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_V1_oNAMjEeWWbMjTqzYc1A" x="-13" y="19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_V1_oNQMjEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_V1_oNgMjEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_lDGrkAMjEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_lCUBYAMjEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lDGrkQMjEeWWbMjTqzYc1A" x="46" y="47"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_V1_oMQMjEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_V1_oMgMjEeWWbMjTqzYc1A" points="[1, 10, 10, -136]$[84, 142, 93, -4]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_V2btEAMjEeWWbMjTqzYc1A" id="(0.2158273381294964,0.24)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nR5eYAMjEeWWbMjTqzYc1A" type="8009" source="_3_NozgMBEeW1-e4oerqxMg" target="_xgRMUAMiEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nR5eYwMjEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_nROI8AMjEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nR5eZAMjEeWWbMjTqzYc1A" x="21" y="-21"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nR5eZQMjEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nR6FcAMjEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nR5eYQMjEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nR5eYgMjEeWWbMjTqzYc1A" points="[61, 0, -145, 2]$[137, 0, -69, 2]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_VkkjMAMyEeWWbMjTqzYc1A" id="(0.8879310344827587,0.48)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_2GQDgAMjEeWWbMjTqzYc1A" type="8009" source="_3_NozgMBEeW1-e4oerqxMg" target="_3_No1gMBEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_2GQqkAMjEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_2FoYcAMjEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2GQqkQMjEeWWbMjTqzYc1A" x="7" y="-19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2GQqkgMjEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2GQqkwMjEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_OcwzAAMyEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_OcDBUAMyEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_OcwzAQMyEeWWbMjTqzYc1A" x="7" y="33"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_2GQDgQMjEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2GQDggMjEeWWbMjTqzYc1A" points="[8, -5, -78, 48]$[64, -54, -22, -1]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2HYE4AMjEeWWbMjTqzYc1A" id="(0.2672413793103448,0.24)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2HYr8AMjEeWWbMjTqzYc1A" id="(0.18181818181818182,0.44)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_dlaNIAMyEeWWbMjTqzYc1A" type="8009" source="_3_NozgMBEeW1-e4oerqxMg" target="_3_No3gMBEeW1-e4oerqxMg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_dlaNIwMyEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_dkuQoAMyEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_dlaNJAMyEeWWbMjTqzYc1A" x="-12" y="34"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_dlaNJQMyEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_dlaNJgMyEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_dlaNIQMyEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_dlaNIgMyEeWWbMjTqzYc1A" points="[-7, 13, 2, -78]$[-7, 79, 2, -12]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_0naJIAMyEeWWbMjTqzYc1A" type="8009" source="_3_NoxgMBEeW1-e4oerqxMg" target="_xgRMUAMiEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_0naJIwMyEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_0mEsYAMyEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0naJJAMyEeWWbMjTqzYc1A" x="1" y="-23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_0naJJQMyEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0naJJgMyEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_0naJIQMyEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_0naJIgMyEeWWbMjTqzYc1A" points="[12, 11, -106, -81]$[49, 87, -69, -5]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_0n1m8AMyEeWWbMjTqzYc1A" id="(0.8503937007874016,0.56)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_nvhdQAMdEeWWbMjTqzYc1A" type="CompositeStructure" name="Notation Synchronization" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_nvhdQQMdEeWWbMjTqzYc1A" type="2075">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6psrcAMhEeWWbMjTqzYc1A" source="PapyrusHyperLink_Page" references="_nvmVwAMdEeWWbMjTqzYc1A">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6psrcQMhEeWWbMjTqzYc1A" key="tooltip_text" value="Synchronize Model Elements"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6psrcgMhEeWWbMjTqzYc1A" key="pageName" value="Synchronize Model Elements"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6psrcwMhEeWWbMjTqzYc1A" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvhdRgMdEeWWbMjTqzYc1A" type="5158"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvhdRwMdEeWWbMjTqzYc1A" type="6090">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvhdSAMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nvhdSQMdEeWWbMjTqzYc1A" type="7075">
+ <children xmi:type="notation:Shape" xmi:id="_nvhdSgMdEeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvhdSwMdEeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvhdTAMdEeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvhdTQMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nvhdTgMdEeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nvhdTwMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvhdUAMdEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_nvdy4QMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvhdVAMdEeWWbMjTqzYc1A" x="46" y="34"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nvhdVQMdEeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvhdVgMdEeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvhdVwMdEeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvhdWAMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nvhdWQMdEeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nvhdWgMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvhdWwMdEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_nvdy4gMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvhdXwMdEeWWbMjTqzYc1A" x="32" y="123"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nvhdYAMdEeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvhdYQMdEeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvhdYgMdEeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvhdYwMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nvhdZAMdEeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nvhdZQMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvhdZgMdEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_nvdy5QMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nviEUwMdEeWWbMjTqzYc1A" x="464" y="245"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nviEVAMdEeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEVQMdEeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEVgMdEeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEVwMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nviEWAMdEeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nviEWQMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nviEWgMdEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_nvdy6AMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nviEXgMdEeWWbMjTqzYc1A" x="326" y="24"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nviEXwMdEeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEYAMdEeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEYQMdEeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEYgMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nviEYwMdEeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nviEZAMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nviEZQMdEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_nvdy6wMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nviEaQMdEeWWbMjTqzYc1A" x="325" y="140"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nviEagMdEeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEawMdEeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEbAMdEeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEbQMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nviEbgMdEeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nviEbwMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nviEcAMdEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_nvdy7gMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nviEdAMdEeWWbMjTqzYc1A" x="92" y="238"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nviEdQMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nviEdgMdEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Collaboration" href="design.uml#_nvdy4AMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nviEegMdEeWWbMjTqzYc1A" x="40" y="40" width="670" height="377"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_nviEewMdEeWWbMjTqzYc1A" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_nviEfAMdEeWWbMjTqzYc1A"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_nviEfQMdEeWWbMjTqzYc1A">
+ <owner xmi:type="uml:Collaboration" href="design.uml#_nvdy4AMdEeWWbMjTqzYc1A"/>
+ </styles>
+ <element xmi:type="uml:Collaboration" href="design.uml#_nvdy4AMdEeWWbMjTqzYc1A"/>
+ <edges xmi:type="notation:Connector" xmi:id="_nviEfgMdEeWWbMjTqzYc1A" type="4013" source="_nvhdSgMdEeWWbMjTqzYc1A" target="_nvhdVQMdEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEfwMdEeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEgAMdEeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEgQMdEeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEggMdEeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEgwMdEeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEhAMdEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEhQMdEeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEhgMdEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nviEhwMdEeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_nvdy8QMdEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nviEiAMdEeWWbMjTqzYc1A" points="[-7, 23, -13, -66]$[-82, 80, -88, -9]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nviEiQMdEeWWbMjTqzYc1A" id="(0.5,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nviEigMdEeWWbMjTqzYc1A" id="(0.3533834586466165,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nviEiwMdEeWWbMjTqzYc1A" type="4013" source="_nviEVAMdEeWWbMjTqzYc1A" target="_nviEXwMdEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEjAMdEeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEjQMdEeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEjgMdEeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEjwMdEeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEkAMdEeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEkQMdEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEkgMdEeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEkwMdEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nviElAMdEeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_nvdy9AMdEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nviElQMdEeWWbMjTqzYc1A" points="[-9, 23, 0, -75]$[-10, 93, -1, -5]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nviElgMdEeWWbMjTqzYc1A" id="(0.449438202247191,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nviElwMdEeWWbMjTqzYc1A" id="(0.48502994011976047,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nviEmAMdEeWWbMjTqzYc1A" type="4013" source="_nviEXwMdEeWWbMjTqzYc1A" target="_nviEagMdEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEmQMdEeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEmgMdEeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEmwMdEeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEnAMdEeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEnQMdEeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEngMdEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEnwMdEeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEoAMdEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nviEoQMdEeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_nvdy9wMdEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nviEogMdEeWWbMjTqzYc1A" points="[-40, 23, 119, -78]$[-165, 78, -6, -23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nviEowMdEeWWbMjTqzYc1A" id="(0.281437125748503,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nviEpAMdEeWWbMjTqzYc1A" id="(0.6395348837209303,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nviEpQMdEeWWbMjTqzYc1A" type="4013" source="_nviEXwMdEeWWbMjTqzYc1A" target="_nvhdYAMdEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEpgMdEeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEpwMdEeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEqAMdEeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEqQMdEeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviEqgMdEeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviEqwMdEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nviErAMdEeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nviErQMdEeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nviErgMdEeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_nvdy-gMdEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nviErwMdEeWWbMjTqzYc1A" points="[16, 23, -47, -77]$[66, 77, 3, -23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nviEsAMdEeWWbMjTqzYc1A" id="(0.718562874251497,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nviEsQMdEeWWbMjTqzYc1A" id="(0.4652777777777778,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_Ql6l8AM0EeWWbMjTqzYc1A" type="4013" source="_nvhdVQMdEeWWbMjTqzYc1A" target="_nviEagMdEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Ql7NAAM0EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Ql7NAQM0EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Ql7NAgM0EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Ql7NAwM0EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Ql7NBAM0EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Ql7NBQM0EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Ql7NBgM0EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Ql7NBwM0EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_Ql6l8QM0EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_Qlw08AM0EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Ql6l8gM0EeWWbMjTqzYc1A" points="[1, 20, -44, -95]$[-73, 114, -118, -1]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_QmTngAM0EeWWbMjTqzYc1A" id="(0.40977443609022557,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_QmTngQM0EeWWbMjTqzYc1A" id="(0.2911392405063291,0.0)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_nvmVwAMdEeWWbMjTqzYc1A" type="PapyrusUMLCommunicationDiagram" name="Synchronize Model Elements" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_nvmVwQMdEeWWbMjTqzYc1A" type="8002">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmVwgMdEeWWbMjTqzYc1A" type="5001"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmVwwMdEeWWbMjTqzYc1A" type="6013">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmVxAMdEeWWbMjTqzYc1A" x="50"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nvmVxQMdEeWWbMjTqzYc1A" type="7001">
+ <children xmi:type="notation:Shape" xmi:id="_nvmVxgMdEeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmVxwMdEeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmVyAMdEeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmVyQMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_nvdy_gMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvmVzQMdEeWWbMjTqzYc1A" x="81" y="38"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nvmVzgMdEeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmVzwMdEeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmV0AMdEeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmV0QMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_nvdy_wMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvmV1QMdEeWWbMjTqzYc1A" x="340" y="43"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nvmV1gMdEeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmV1wMdEeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmV2AMdEeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmV2QMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_nvdzAAMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvmV3QMdEeWWbMjTqzYc1A" x="75" y="124"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nvmV3gMdEeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmV3wMdEeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmV4AMdEeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmV4QMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_nvdzAQMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvmV5QMdEeWWbMjTqzYc1A" x="94" y="251"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nvmV5gMdEeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmV5wMdEeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmV6AMdEeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmV6QMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_nvdzAgMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvmV7QMdEeWWbMjTqzYc1A" x="330" y="199"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nvmV7gMdEeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmV7wMdEeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmV8AMdEeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmV8QMdEeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_nvdzAwMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvmV9QMdEeWWbMjTqzYc1A" x="336" y="299"/>
+ </children>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvmV9gMdEeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Interaction" href="design.uml#_nvdy_QMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nvmV-gMdEeWWbMjTqzYc1A" width="592" height="401"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_nvmV-wMdEeWWbMjTqzYc1A" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_nvmV_AMdEeWWbMjTqzYc1A"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_nvmV_QMdEeWWbMjTqzYc1A">
+ <owner xmi:type="uml:Interaction" href="design.uml#_nvdy_QMdEeWWbMjTqzYc1A"/>
+ </styles>
+ <element xmi:type="uml:Interaction" href="design.uml#_nvdy_QMdEeWWbMjTqzYc1A"/>
+ <edges xmi:type="notation:Connector" xmi:id="_nvmV_gMdEeWWbMjTqzYc1A" type="8009" source="_nvmVxgMdEeWWbMjTqzYc1A" target="_nvmVzgMdEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmV_wMdEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_nvdzEAMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWAAMdEeWWbMjTqzYc1A" x="1" y="-23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmWAQMdEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWAgMdEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmWAwMdEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_nvdzFQMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWBAMdEeWWbMjTqzYc1A" x="-7" y="16"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nvmWBQMdEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nvmWBgMdEeWWbMjTqzYc1A" points="[60, 7, -203, 2]$[200, 7, -63, 2]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nvmWBwMdEeWWbMjTqzYc1A" type="8009" source="_nvmVzgMdEeWWbMjTqzYc1A" target="_nvmV5gMdEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmWCAMdEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_nvdzEQMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWCQMdEeWWbMjTqzYc1A" x="-10" y="-39"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmWCgMdEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWCwMdEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Vk-tgAMfEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_VjrF8AMfEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Vk-tgQMfEeWWbMjTqzYc1A" x="-5" y="34"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nvmWDAMdEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nvmWDQMdEeWWbMjTqzYc1A" points="[-1, 13, 13, -178]$[-14, 188, 0, -3]"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nvmWDgMdEeWWbMjTqzYc1A" id="(0.512396694214876,0.12)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nvmWDwMdEeWWbMjTqzYc1A" type="8009" source="_nvmV5gMdEeWWbMjTqzYc1A" target="_nvmV3gMdEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmWEAMdEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_nvdzEgMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWEQMdEeWWbMjTqzYc1A" x="9" y="39"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmWEgMdEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWEwMdEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nvmWFAMdEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nvmWFQMdEeWWbMjTqzYc1A" points="[-15, 6, 92, -41]$[-86, 44, 21, -3]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nvmWFgMdEeWWbMjTqzYc1A" id="(0.12396694214876033,0.52)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nvmWFwMdEeWWbMjTqzYc1A" id="(0.8189655172413793,0.32)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nvmWGAMdEeWWbMjTqzYc1A" type="8009" source="_nvmV3gMdEeWWbMjTqzYc1A" target="_nvmV7gMdEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmWGQMdEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_nvdzEwMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWGgMdEeWWbMjTqzYc1A" x="1" y="-23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmWGwMdEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWHAMdEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nvmWHQMdEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nvmWHgMdEeWWbMjTqzYc1A" points="[17, 7, -97, -46]$[94, 56, -20, 3]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nvmWHwMdEeWWbMjTqzYc1A" id="(0.853448275862069,0.48)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nvmWIAMdEeWWbMjTqzYc1A" id="(0.2,0.68)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nvmWIQMdEeWWbMjTqzYc1A" type="8009" source="_nvmV3gMdEeWWbMjTqzYc1A" target="_nvmV1gMdEeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmWIgMdEeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_nvdzFAMdEeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWIwMdEeWWbMjTqzYc1A" x="21" y="-23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nvmWJAMdEeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nvmWJQMdEeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nvmWJgMdEeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nvmWJwMdEeWWbMjTqzYc1A" points="[-6, -12, 57, 115]$[-53, -114, 10, 13]"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_XpaocAM1EeWWbMjTqzYc1A" type="CompositeStructure" name="Synchronization Exclusions" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_XpaocQM1EeWWbMjTqzYc1A" type="2075">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_uvpkMAM1EeWWbMjTqzYc1A" source="PapyrusHyperLink_Page" references="_XpdrwAM1EeWWbMjTqzYc1A">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_uvpkMQM1EeWWbMjTqzYc1A" key="tooltip_text" value="Exclude Views from Synchronization"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_uvpkMgM1EeWWbMjTqzYc1A" key="pageName" value="Exclude Views from Synchronization"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_uvpkMwM1EeWWbMjTqzYc1A" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaodgM1EeWWbMjTqzYc1A" type="5158"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaodwM1EeWWbMjTqzYc1A" type="6090">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpaoeAM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XpaoeQM1EeWWbMjTqzYc1A" type="7075">
+ <children xmi:type="notation:Shape" xmi:id="_XpaoegM1EeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaoewM1EeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaofAM1EeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpaofQM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XpaofgM1EeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_XpaofwM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaogAM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_XpZaUQM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaohAM1EeWWbMjTqzYc1A" x="289" y="32"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XpaohQM1EeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaohgM1EeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaohwM1EeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpaoiAM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XpaoiQM1EeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_XpaoigM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaoiwM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_XpZaUgM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaojwM1EeWWbMjTqzYc1A" x="266" y="123"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XpaokAM1EeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaokQM1EeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaokgM1EeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpaokwM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XpaolAM1EeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_XpaolQM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaolgM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_XpZaVQM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaomgM1EeWWbMjTqzYc1A" x="10" y="213"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XpaomwM1EeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaonAM1EeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaonQM1EeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpaongM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XpaonwM1EeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_XpaooAM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaooQM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_XpZaWAM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaopQM1EeWWbMjTqzYc1A" x="56" y="33"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XpaopgM1EeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaopwM1EeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaoqAM1EeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpaoqQM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XpaoqgM1EeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_XpaoqwM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaorAM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_XpZaWwM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaosAM1EeWWbMjTqzYc1A" x="43" y="122"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XpaosQM1EeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaosgM1EeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaoswM1EeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpaotAM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XpaotQM1EeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_XpaotgM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaotwM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_XpZaXgM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaouwM1EeWWbMjTqzYc1A" x="131" y="270"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XpaovAM1EeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaovQM1EeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaovgM1EeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpaovwM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XpaowAM1EeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_XpaowQM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaowgM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_XpZaYQM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaoxgM1EeWWbMjTqzYc1A" x="547" y="121"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XpaoxwM1EeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaoyAM1EeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpaoyQM1EeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpaoygM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XpaoywM1EeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_XpaozAM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpaozQM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_XpZaYgM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Xpao0QM1EeWWbMjTqzYc1A" x="416" y="272"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Xpao0gM1EeWWbMjTqzYc1A" type="3070">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpao0wM1EeWWbMjTqzYc1A" type="5126"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpao1AM1EeWWbMjTqzYc1A" type="6054">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpao1QM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Xpao1gM1EeWWbMjTqzYc1A" visible="false" type="7077">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Xpao1wM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Xpao2AM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Property" href="design.uml#_XpZaZQM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Xpao3AM1EeWWbMjTqzYc1A" x="478" y="203"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Xpao3QM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Xpao3gM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Collaboration" href="design.uml#_XpZaUAM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Xpao4gM1EeWWbMjTqzYc1A" x="40" y="40" width="758" height="367"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_Xpao4wM1EeWWbMjTqzYc1A" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_Xpao5AM1EeWWbMjTqzYc1A"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_Xpao5QM1EeWWbMjTqzYc1A">
+ <owner xmi:type="uml:Collaboration" href="design.uml#_XpZaUAM1EeWWbMjTqzYc1A"/>
+ </styles>
+ <element xmi:type="uml:Collaboration" href="design.uml#_XpZaUAM1EeWWbMjTqzYc1A"/>
+ <edges xmi:type="notation:Connector" xmi:id="_Xpao5gM1EeWWbMjTqzYc1A" type="4013" source="_XpaoegM1EeWWbMjTqzYc1A" target="_XpaohQM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpao5wM1EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpao6AM1EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpao6QM1EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpao6gM1EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpao6wM1EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpao7AM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpao7QM1EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpao7gM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_Xpao7wM1EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_XpZaZgM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Xpao8AM1EeWWbMjTqzYc1A" points="[-7, 23, -13, -66]$[-82, 80, -88, -9]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Xpao8QM1EeWWbMjTqzYc1A" id="(0.4375,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Xpao8gM1EeWWbMjTqzYc1A" id="(0.4011299435028249,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_Xpao8wM1EeWWbMjTqzYc1A" type="4013" source="_XpaomwM1EeWWbMjTqzYc1A" target="_XpaopgM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpao9AM1EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpao9QM1EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpao9gM1EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpao9wM1EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpao-AM1EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpao-QM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpao-gM1EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpao-wM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_Xpao_AM1EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_XpZaaQM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Xpao_QM1EeWWbMjTqzYc1A" points="[-9, 23, 0, -75]$[-10, 93, -1, -5]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Xpao_gM1EeWWbMjTqzYc1A" id="(0.449438202247191,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Xpao_wM1EeWWbMjTqzYc1A" id="(0.48502994011976047,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_XpapAAM1EeWWbMjTqzYc1A" type="4013" source="_XpaopgM1EeWWbMjTqzYc1A" target="_XpaosQM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpapAQM1EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpapAgM1EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpapAwM1EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpapBAM1EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpapBQM1EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpapBgM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpapBwM1EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpapCAM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_XpapCQM1EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_XpZabAM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_XpapCgM1EeWWbMjTqzYc1A" points="[-40, 23, 119, -78]$[-165, 78, -6, -23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpapCwM1EeWWbMjTqzYc1A" id="(0.592814371257485,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpapDAM1EeWWbMjTqzYc1A" id="(0.6395348837209303,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_XpapDQM1EeWWbMjTqzYc1A" type="4013" source="_XpaopgM1EeWWbMjTqzYc1A" target="_XpaokAM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpapDgM1EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpapDwM1EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpapEAM1EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpapEQM1EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpapEgM1EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpapEwM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpapFAM1EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpapFQM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_XpapFgM1EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_XpZabwM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_XpapFwM1EeWWbMjTqzYc1A" points="[16, 23, -47, -77]$[66, 77, 3, -23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpapGAM1EeWWbMjTqzYc1A" id="(0.4311377245508982,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpapGQM1EeWWbMjTqzYc1A" id="(0.4652777777777778,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_XpapGgM1EeWWbMjTqzYc1A" type="4013" source="_XpaovAM1EeWWbMjTqzYc1A" target="_Xpao0gM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpapGwM1EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPgAM1EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPgQM1EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPggM1EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPgwM1EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPhAM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPhQM1EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPhgM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_XpbPhwM1EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_XpZacgM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_XpbPiAM1EeWWbMjTqzYc1A" points="[-4, 23, 9, -64]$[-15, 64, -2, -23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpbPiQM1EeWWbMjTqzYc1A" id="(0.39226519337016574,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpbPigM1EeWWbMjTqzYc1A" id="(0.4844961240310077,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_XpbPiwM1EeWWbMjTqzYc1A" type="4013" source="_Xpao0gM1EeWWbMjTqzYc1A" target="_XpaoxwM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPjAM1EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPjQM1EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPjgM1EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPjwM1EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPkAM1EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPkQM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPkgM1EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPkwM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_XpbPlAM1EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_XpZadQM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_XpbPlQM1EeWWbMjTqzYc1A" points="[-3, 23, 9, -69]$[-25, 82, -13, -10]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpbPlgM1EeWWbMjTqzYc1A" id="(0.2596899224806202,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpbPlwM1EeWWbMjTqzYc1A" id="(0.4867924528301887,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_XpbPmAM1EeWWbMjTqzYc1A" type="4013" source="_XpaohQM1EeWWbMjTqzYc1A" target="_XpaovAM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPmQM1EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPmgM1EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPmwM1EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPnAM1EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPnQM1EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPngM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPnwM1EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPoAM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_XpbPoQM1EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_XpZaeAM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_XpbPogM1EeWWbMjTqzYc1A" points="[34, -16, -134, 61]$[137, -74, -31, 3]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpbPowM1EeWWbMjTqzYc1A" id="(1.0,0.475)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpbPpAM1EeWWbMjTqzYc1A" id="(0.0,0.575)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_XpbPpQM1EeWWbMjTqzYc1A" type="4013" source="_XpaohQM1EeWWbMjTqzYc1A" target="_XpaoxwM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPpgM1EeWWbMjTqzYc1A" visible="false" type="6025">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPpwM1EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPqAM1EeWWbMjTqzYc1A" visible="false" type="6050">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPqQM1EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPqgM1EeWWbMjTqzYc1A" visible="false" type="6051">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPqwM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpbPrAM1EeWWbMjTqzYc1A" visible="false" type="6052">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpbPrQM1EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_XpbPrgM1EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Connector" href="design.uml#_XpZaewM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_XpbPrwM1EeWWbMjTqzYc1A" points="[-6, 9, 49, -78]$[-33, 83, 22, -4]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpbPsAM1EeWWbMjTqzYc1A" id="(0.41700404858299595,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpbPsQM1EeWWbMjTqzYc1A" id="(0.06415094339622641,0.0)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_XpdrwAM1EeWWbMjTqzYc1A" type="PapyrusUMLCommunicationDiagram" name="Exclude Views from Synchronization" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_XpdrwQM1EeWWbMjTqzYc1A" type="8002">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdrwgM1EeWWbMjTqzYc1A" type="5001"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdrwwM1EeWWbMjTqzYc1A" type="6013">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdrxAM1EeWWbMjTqzYc1A" x="50"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_XpdrxQM1EeWWbMjTqzYc1A" type="7001">
+ <children xmi:type="notation:Shape" xmi:id="_XpdrxgM1EeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdrxwM1EeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdryAM1EeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdryQM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_XpZafwM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpdrzQM1EeWWbMjTqzYc1A" x="118" y="41"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XpdrzgM1EeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdrzwM1EeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpdr0AM1EeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpdr0QM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_XpZagAM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Xpdr1QM1EeWWbMjTqzYc1A" x="71" y="170"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Xpdr1gM1EeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpdr1wM1EeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpdr2AM1EeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpdr2QM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_XpZagQM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Xpdr3QM1EeWWbMjTqzYc1A" x="312" y="82"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Xpdr9gM1EeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpdr9wM1EeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpdr-AM1EeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Xpdr-QM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_XpZahQM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Xpdr_QM1EeWWbMjTqzYc1A" x="413" y="192"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Xpdr_gM1EeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Xpdr_wM1EeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdsAAM1EeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdsAQM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_XpZahgM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpdsBQM1EeWWbMjTqzYc1A" x="407" y="328"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XpdsBgM1EeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdsBwM1EeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdsCAM1EeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdsCQM1EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_XpZahwM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpdsDQM1EeWWbMjTqzYc1A" x="207" y="275"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_MHRwEAM3EeWWbMjTqzYc1A" type="8001">
+ <children xmi:type="notation:DecorationNode" xmi:id="_MHRwEgM3EeWWbMjTqzYc1A" type="5002"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_MHRwEwM3EeWWbMjTqzYc1A" type="6014">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_MHRwFAM3EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <element xmi:type="uml:Lifeline" href="design.uml#_MHImIAM3EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MHRwEQM3EeWWbMjTqzYc1A" x="168" y="384"/>
+ </children>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpdsDgM1EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Interaction" href="design.uml#_XpZafgM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XpdsEgM1EeWWbMjTqzYc1A" width="669" height="463"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_XpdsEwM1EeWWbMjTqzYc1A" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_XpdsFAM1EeWWbMjTqzYc1A"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_XpdsFQM1EeWWbMjTqzYc1A">
+ <owner xmi:type="uml:Interaction" href="design.uml#_XpZafgM1EeWWbMjTqzYc1A"/>
+ </styles>
+ <element xmi:type="uml:Interaction" href="design.uml#_XpZafgM1EeWWbMjTqzYc1A"/>
+ <edges xmi:type="notation:Connector" xmi:id="_XpdsFgM1EeWWbMjTqzYc1A" type="8009" source="_XpdrxgM1EeWWbMjTqzYc1A" target="_XpdrzgM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdsGQM1EeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdsGgM1EeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_BcscsAM3EeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_BcHN4AM3EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_BcscsQM3EeWWbMjTqzYc1A" x="-3" y="25"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_EH7T4AM3EeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_EGr9wAM3EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_EH7T4QM3EeWWbMjTqzYc1A" x="-3" y="-43"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_XpdsHQM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_XpdsHgM1EeWWbMjTqzYc1A" points="[60, 7, -203, 2]$[200, 7, -63, 2]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_XpdsMAM1EeWWbMjTqzYc1A" type="8009" source="_Xpdr9gM1EeWWbMjTqzYc1A" target="_Xpdr_gM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdsMQM1EeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_XpZaqgM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdsMgM1EeWWbMjTqzYc1A" x="-40" y="26"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdsMwM1EeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdsNAM1EeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_XpdsNQM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_XpdsNgM1EeWWbMjTqzYc1A" points="[-9, 13, 64, -89]$[-74, 115, -1, 13]"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpdsNwM1EeWWbMjTqzYc1A" id="(0.8425925925925926,0.28)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_XpdsOAM1EeWWbMjTqzYc1A" type="8009" source="_Xpdr9gM1EeWWbMjTqzYc1A" target="_XpdsBgM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdsOQM1EeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_XpZaqwM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdsOgM1EeWWbMjTqzYc1A" x="-13" y="19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdsOwM1EeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdsPAM1EeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_XpdsPwM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_XpdsQAM1EeWWbMjTqzYc1A" points="[1, 10, 10, -136]$[84, 142, 93, -4]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpdsQQM1EeWWbMjTqzYc1A" id="(0.2158273381294964,0.24)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_XpdsXAM1EeWWbMjTqzYc1A" type="8009" source="_Xpdr1gM1EeWWbMjTqzYc1A" target="_Xpdr9gM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdsXQM1EeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_XpZasQM1EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdsXgM1EeWWbMjTqzYc1A" x="-27" y="28"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_XpdsXwM1EeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XpdsYAM1EeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_XpdsYQM1EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_XpdsYgM1EeWWbMjTqzYc1A" points="[12, 11, -106, -81]$[49, 87, -69, -5]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_XpdsYwM1EeWWbMjTqzYc1A" id="(0.8503937007874016,0.56)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="__exXcAM2EeWWbMjTqzYc1A" type="8009" source="_XpdsBgM1EeWWbMjTqzYc1A" target="_XpdrzgM1EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="__ex-gAM2EeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#__dgzMAM2EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__ex-gQM2EeWWbMjTqzYc1A" x="28" y="-23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="__ex-ggM2EeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__ex-gwM2EeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_IIbU4AM3EeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_IH2GEAM3EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_IIbU4QM3EeWWbMjTqzYc1A" x="-17" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="__exXcQM2EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="__exXcgM2EeWWbMjTqzYc1A" points="[-6, -11, 97, 99]$[-5, -110, 98, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="__fDEQAM2EeWWbMjTqzYc1A" id="(0.16964285714285715,0.44)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_Q8bhIAM3EeWWbMjTqzYc1A" type="8009" source="_XpdsBgM1EeWWbMjTqzYc1A" target="_MHRwEAM3EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Q8bhIwM3EeWWbMjTqzYc1A" type="6001">
+ <element xmi:type="uml:Message" href="design.uml#_Q7yA4AM3EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Q8bhJAM3EeWWbMjTqzYc1A" x="26" y="46"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Q8bhJQM3EeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Q8bhJgM3EeWWbMjTqzYc1A" x="1" y="-53"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_Q8bhIQM3EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Q8bhIgM3EeWWbMjTqzYc1A" points="[-38, 13, 135, -40]$[-109, 48, 64, -5]"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_aCgfYAM4EeWWbMjTqzYc1A" type="PapyrusUMLClassDiagram" name="Test Plug-ins" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_bQShIAM4EeWWbMjTqzYc1A" type="2002">
+ <children xmi:type="notation:DecorationNode" xmi:id="_bQShIgM4EeWWbMjTqzYc1A" type="5005"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_bQTIMAM4EeWWbMjTqzYc1A" type="8503">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_bQTIMQM4EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_bQTIMgM4EeWWbMjTqzYc1A" visible="false" type="7002">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_bQTIMwM4EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_bQTINAM4EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_bQTINQM4EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bQTINgM4EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_bQTINwM4EeWWbMjTqzYc1A" visible="false" type="7003">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_bQTIOAM4EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_bQTIOQM4EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_bQTIOgM4EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bQTIOwM4EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_bQTIPAM4EeWWbMjTqzYc1A" visible="false" type="7004">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_bQTIPQM4EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_bQTIPgM4EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_bQTIPwM4EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bQTIQAM4EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Component" href="design.uml#_bQLMYAM4EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bQShIQM4EeWWbMjTqzYc1A" x="151" y="106" height="72"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_qBAjcAM4EeWWbMjTqzYc1A" type="2007">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_ih54IAM5EeWWbMjTqzYc1A" source="PapyrusHyperLink_Page" references="_hbcmYAM5EeWWbMjTqzYc1A">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_ih54IQM5EeWWbMjTqzYc1A" key="tooltip_text" value="Test Classes"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_ih54IgM5EeWWbMjTqzYc1A" key="pageName" value="Test Classes"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_ih54IwM5EeWWbMjTqzYc1A" key="is_default_navigation" value="true"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_qBAjcgM4EeWWbMjTqzYc1A" type="5026"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_qBAjcwM4EeWWbMjTqzYc1A" type="7016">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_qBAjdAM4EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qBAjdQM4EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Package" href="design.uml#_qA5OsAM4EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qBAjcQM4EeWWbMjTqzYc1A" x="141" y="289"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_aCgfYQM4EeWWbMjTqzYc1A" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_aCgfYgM4EeWWbMjTqzYc1A"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_aCgfYwM4EeWWbMjTqzYc1A">
+ <owner xmi:type="uml:Model" href="design.uml#_y3pEOACLEeWudc8agGQ04Q"/>
+ </styles>
+ <element xmi:type="uml:Model" href="design.uml#_y3pEOACLEeWudc8agGQ04Q"/>
+ <edges xmi:type="notation:Connector" xmi:id="_xQ7t0AM4EeWWbMjTqzYc1A" type="4005" source="_qBAjcAM4EeWWbMjTqzYc1A" target="_bQShIAM4EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_xQ7t0wM4EeWWbMjTqzYc1A" type="6012">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xQ7t1AM4EeWWbMjTqzYc1A" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_xQ7t1QM4EeWWbMjTqzYc1A" type="6013">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xQ7t1gM4EeWWbMjTqzYc1A" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_xQ7t0QM4EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Realization" href="design.uml#_xQPxUAM4EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_xQ7t0gM4EeWWbMjTqzYc1A" points="[1, -6, -10, 147]$[-107, -147, -118, 6]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_xRHUAAM4EeWWbMjTqzYc1A" id="(0.4349442379182156,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_xRHUAQM4EeWWbMjTqzYc1A" id="(0.4533898305084746,1.0)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_hbcmYAM5EeWWbMjTqzYc1A" type="PapyrusUMLClassDiagram" name="Test Classes" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_juC7IAM5EeWWbMjTqzYc1A" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_juC7IgM5EeWWbMjTqzYc1A" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_juC7IwM5EeWWbMjTqzYc1A" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_juC7JAM5EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_juC7JQM5EeWWbMjTqzYc1A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_juC7JgM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_juC7JwM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_juC7KAM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_juC7KQM5EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_juC7KgM5EeWWbMjTqzYc1A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_juC7KwM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_juC7LAM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_juC7LQM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_juC7LgM5EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_juC7LwM5EeWWbMjTqzYc1A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_juC7MAM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_juC7MQM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_juC7MgM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_juC7MwM5EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_jt_QwAM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_juC7IQM5EeWWbMjTqzYc1A" x="95" y="118"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_lhPXEAM5EeWWbMjTqzYc1A" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_lhPXEgM5EeWWbMjTqzYc1A" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_lhPXEwM5EeWWbMjTqzYc1A" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lhPXFAM5EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_lhPXFQM5EeWWbMjTqzYc1A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_lhPXFgM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_lhPXFwM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_lhPXGAM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lhPXGQM5EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_lhPXGgM5EeWWbMjTqzYc1A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_lhPXGwM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_lhPXHAM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_lhPXHQM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lhPXHgM5EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_lhPXHwM5EeWWbMjTqzYc1A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_lhPXIAM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_lhPXIQM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_lhPXIgM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lhPXIwM5EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_lhLFoAM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lhPXEQM5EeWWbMjTqzYc1A" x="341" y="117"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nzcDMAM5EeWWbMjTqzYc1A" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nzcqQAM5EeWWbMjTqzYc1A" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_nzcqQQM5EeWWbMjTqzYc1A" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nzcqQgM5EeWWbMjTqzYc1A" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzcqQwM5EeWWbMjTqzYc1A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzcqRAM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nzcqRQM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nzcqRgM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzcqRwM5EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzcqSAM5EeWWbMjTqzYc1A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzcqSQM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nzcqSgM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nzcqSwM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzcqTAM5EeWWbMjTqzYc1A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nzcqTQM5EeWWbMjTqzYc1A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzcqTgM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nzcqTwM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nzcqUAM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzcqUQM5EeWWbMjTqzYc1A"/>
+ </children>
+ <element xmi:type="uml:Class" href="design.uml#_nytqcAM5EeWWbMjTqzYc1A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzcDMQM5EeWWbMjTqzYc1A" x="227" y="315"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_hbcmYQM5EeWWbMjTqzYc1A" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_hbcmYgM5EeWWbMjTqzYc1A"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_hbcmYwM5EeWWbMjTqzYc1A">
+ <owner xmi:type="uml:Package" href="design.uml#_qA5OsAM4EeWWbMjTqzYc1A"/>
+ </styles>
+ <element xmi:type="uml:Package" href="design.uml#_qA5OsAM4EeWWbMjTqzYc1A"/>
+ <edges xmi:type="notation:Connector" xmi:id="_sIeJwAM5EeWWbMjTqzYc1A" type="4001" source="_lhPXEAM5EeWWbMjTqzYc1A" target="_nzcDMAM5EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_sIeJwwM5EeWWbMjTqzYc1A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_sIeJxAM5EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_sIeJxQM5EeWWbMjTqzYc1A" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_sIeJxgM5EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_sIeJxwM5EeWWbMjTqzYc1A" visible="false" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_sIeJyAM5EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_sIeJyQM5EeWWbMjTqzYc1A" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_sIeJygM5EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_sIeJywM5EeWWbMjTqzYc1A" visible="false" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_sIeJzAM5EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_sIew0AM5EeWWbMjTqzYc1A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_sIew0QM5EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_sIeJwQM5EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Association" href="design.uml#_sIEhIAM5EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sIeJwgM5EeWWbMjTqzYc1A" points="[-16, 23, 100, -148]$[-81, 121, 35, -50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_sI7cwAM5EeWWbMjTqzYc1A" id="(0.26277372262773724,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_sI7cwQM5EeWWbMjTqzYc1A" id="(0.84,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_spRJsAM5EeWWbMjTqzYc1A" type="4001" source="_juC7IAM5EeWWbMjTqzYc1A" target="_nzcDMAM5EeWWbMjTqzYc1A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_spRwwAM5EeWWbMjTqzYc1A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_spRwwQM5EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_spRwwgM5EeWWbMjTqzYc1A" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_spRwwwM5EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_spRwxAM5EeWWbMjTqzYc1A" visible="false" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_spRwxQM5EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_spRwxgM5EeWWbMjTqzYc1A" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_spRwxwM5EeWWbMjTqzYc1A" x="-18" y="24"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_spRwyAM5EeWWbMjTqzYc1A" visible="false" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_spRwyQM5EeWWbMjTqzYc1A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_spRwygM5EeWWbMjTqzYc1A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_spRwywM5EeWWbMjTqzYc1A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_spRJsQM5EeWWbMjTqzYc1A"/>
+ <element xmi:type="uml:Association" href="design.uml#_spH_wAM5EeWWbMjTqzYc1A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_spRJsgM5EeWWbMjTqzYc1A" points="[15, 21, -106, -147]$[114, 118, -7, -50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_spwR4AM5EeWWbMjTqzYc1A" id="(0.4935064935064935,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_spwR4QM5EeWWbMjTqzYc1A" id="(0.18,0.0)"/>
+ </edges>
+ </notation:Diagram>
+</xmi:XMI>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.uml b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.uml
new file mode 100644
index 00000000000..72e6bbd71c9
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/design.uml
@@ -0,0 +1,1139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Requirements="http://www.eclipse.org/papyrus/0.7.0/SysML/Requirements" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:standard="http://www.eclipse.org/uml2/5.0.0/UML/Profile/Standard" xmlns:structure="http://DeveloperProcess/schemas/structure/_rpmLUHVxEeSZ-fQGFkyJeQ/6" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/papyrus/0.7.0/SysML/Requirements http://www.eclipse.org/papyrus/0.7.0/SysML#//requirements http://DeveloperProcess/schemas/structure/_rpmLUHVxEeSZ-fQGFkyJeQ/6 pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_rpmyYHVxEeSZ-fQGFkyJeQ">
+ <uml:Model xmi:id="_y3pEMACLEeWudc8agGQ04Q" name="diagram-sync">
+ <packageImport xmi:type="uml:PackageImport" xmi:id="_y3pEMQCLEeWudc8agGQ04Q">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Model" xmi:id="_y3pEMgCLEeWudc8agGQ04Q" name="Requirements">
+ <packagedElement xmi:type="uml:Class" xmi:id="_H3xwAP_lEeScYo8tuJyy0A" name="Model-to-Model Sync"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_NlpXIP_4EeScYo8tuJyy0A" name="Additional Content"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_e-QjYP_lEeScYo8tuJyy0A" name="Diagram-to-Diagram Sync"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_lWa_UP_lEeScYo8tuJyy0A" name="Sync Override"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_obO-sP_mEeScYo8tuJyy0A" client="_lWa_UP_lEeScYo8tuJyy0A" supplier="_e-QjYP_lEeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_h2TbYACREeWudc8agGQ04Q" client="_NlpXIP_4EeScYo8tuJyy0A" supplier="_H3xwAP_lEeScYo8tuJyy0A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Model" xmi:id="_y3pEMwCLEeWudc8agGQ04Q" name="Use Cases">
+ <packagedElement xmi:type="uml:Component" xmi:id="_xS4T0P_xEeScYo8tuJyy0A" name="UML-RT Capsule State Machine Diagram Synchronization" useCase="_BwcAgP_0EeScYo8tuJyy0A _xdObQP_0EeScYo8tuJyy0A _zJRGUP_0EeScYo8tuJyy0A _226cwP_0EeScYo8tuJyy0A _5w1QMP_0EeScYo8tuJyy0A __JdhwP_0EeScYo8tuJyy0A _J0AScACxEeWnE_cMzyyIKA">
+ <ownedUseCase xmi:type="uml:UseCase" xmi:id="_BwcAgP_0EeScYo8tuJyy0A" name="Add elements to general state machine" subject="_xS4T0P_xEeScYo8tuJyy0A">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_Ydm7wACTEeWudc8agGQ04Q" annotatedElement="_BwcAgP_0EeScYo8tuJyy0A">
+ <body>The UML-RT model has a Capsule that is specialized by some other Capsule
+that has a state machine redefining the parent Capsule's state machine.
+
+When the user adds states, transitions, regions, and other vertices to the
+parent state machine, the system adds corresponding elements to the
+child Capsule's state machine with appropriate redefinition associations.</body>
+ </ownedComment>
+ </ownedUseCase>
+ <ownedUseCase xmi:type="uml:UseCase" xmi:id="_xdObQP_0EeScYo8tuJyy0A" name="Delete elements from general state machine" subject="_xS4T0P_xEeScYo8tuJyy0A">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_tLJh0ACTEeWudc8agGQ04Q" annotatedElement="_xdObQP_0EeScYo8tuJyy0A">
+ <body>The UML-RT model has a Capsule that is specialized by some other Capsule
+that has a state machine redefining the parent Capsule's state machine.
+
+When the user deletes states, transitions, regions, and other vertices from
+the parent state machine, the system deletes the corresponding redefining
+elements from the child Capsule's state machine.</body>
+ </ownedComment>
+ </ownedUseCase>
+ <ownedUseCase xmi:type="uml:UseCase" xmi:id="_zJRGUP_0EeScYo8tuJyy0A" name="Lay out elements in general state machine" subject="_xS4T0P_xEeScYo8tuJyy0A">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_MH8xMACUEeWudc8agGQ04Q" annotatedElement="_zJRGUP_0EeScYo8tuJyy0A">
+ <body>The UML-RT model has a Capsule that is specialized by some other Capsule
+that has a state machine redefining the parent Capsule's state machine.
+
+When the user moves and sizes states, regions, and other vertices in the
+parent state machine diagram, the system moves and sizes the
+corresponding redefining elements in the child Capsule's state machine
+diagram to the redefined elements' locations and sizes, respectively.</body>
+ </ownedComment>
+ </ownedUseCase>
+ <ownedUseCase xmi:type="uml:UseCase" xmi:id="_226cwP_0EeScYo8tuJyy0A" name="Hide elements in general state machine" subject="_xS4T0P_xEeScYo8tuJyy0A">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_UhkHgACUEeWudc8agGQ04Q" annotatedElement="_226cwP_0EeScYo8tuJyy0A">
+ <body>The UML-RT model has a Capsule that is specialized by some other Capsule
+that has a state machine redefining the parent Capsule's state machine.
+
+When the user hides states, regions, and other vertices from the
+parent state machine diagram (deleting the views but not the model
+elements, themselves), the system removes the views of the
+corresponding redefining elements from the child Capsule's state
+machine diagram.</body>
+ </ownedComment>
+ </ownedUseCase>
+ <ownedUseCase xmi:type="uml:UseCase" xmi:id="_5w1QMP_0EeScYo8tuJyy0A" name="Add elements to special state machine" subject="_xS4T0P_xEeScYo8tuJyy0A">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_xMn9wACUEeWudc8agGQ04Q" annotatedElement="_5w1QMP_0EeScYo8tuJyy0A">
+ <body>The UML-RT model has a Capsule that is specialized by some other Capsule
+that has a state machine redefining the parent Capsule's state machine.
+
+The user adds states, transitions, regions, and other vertices to the child
+Capsule's state machine that are new in this context, not redefining any
+elements from the parent state machine. These may be positioned anywhere
+in the child state machine diagram.
+
+Also, transitions that redefine inherited transitions in the parent state machine
+may be re-targeted and/or re-sourced as necessary in the child capsule. This
+includes re-connecting transitions to states and other vertices that exist only
+in the child capsule's state machine (that do not redefine inherited vertices).</body>
+ </ownedComment>
+ </ownedUseCase>
+ <ownedUseCase xmi:type="uml:UseCase" xmi:id="__JdhwP_0EeScYo8tuJyy0A" name="Lay out elements in special state machine" subject="_xS4T0P_xEeScYo8tuJyy0A">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_A29vsACVEeWudc8agGQ04Q" annotatedElement="__JdhwP_0EeScYo8tuJyy0A">
+ <body>The UML-RT model has a Capsule that is specialized by some other Capsule
+that has a state machine redefining the parent Capsule's state machine.
+
+When the user deliberately moves and sizes states, regions, and other
+vertices in the child Capsule's state machine diagram, the system detects
+this and exempts the affected views from subsequent synchronization
+of the location and/or size (as appropriate) from the parent state machine
+diagram. Layout changes in the redefined elements in the parent state
+machine diagram are no longer propagated to these views in the child
+state machine diagram.
+</body>
+ </ownedComment>
+ </ownedUseCase>
+ <ownedUseCase xmi:type="uml:UseCase" xmi:id="_J0AScACxEeWnE_cMzyyIKA" name="Synchronization Lifecycle" subject="_xS4T0P_xEeScYo8tuJyy0A">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_lM4vIACxEeWnE_cMzyyIKA" annotatedElement="_J0AScACxEeWnE_cMzyyIKA">
+ <body>When an editor is opened, the system initializes synchronization of
+model and diagram content according to the state machine
+synchronization triggers defined by the UML-RT plug-in.
+The synchronization system is destroyed when the editor is closed.</body>
+ </ownedComment>
+ </ownedUseCase>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Actor" xmi:id="_B0KNcP_1EeScYo8tuJyy0A" name="User"/>
+ <packagedElement xmi:type="uml:Association" xmi:id="_C7VQ4P_1EeScYo8tuJyy0A" memberEnd="_C7aJYP_1EeScYo8tuJyy0A _C7awcP_1EeScYo8tuJyy0A">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_C7Y7QP_1EeScYo8tuJyy0A" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_C7Y7Qf_1EeScYo8tuJyy0A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_C7aJYP_1EeScYo8tuJyy0A" name="add elements to general state machine" type="_BwcAgP_0EeScYo8tuJyy0A" association="_C7VQ4P_1EeScYo8tuJyy0A"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_C7awcP_1EeScYo8tuJyy0A" name="user" type="_B0KNcP_1EeScYo8tuJyy0A" association="_C7VQ4P_1EeScYo8tuJyy0A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_EvogEP_1EeScYo8tuJyy0A" name="" memberEnd="_EvpHIf_1EeScYo8tuJyy0A _EvpHIv_1EeScYo8tuJyy0A">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_EvogEf_1EeScYo8tuJyy0A" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_EvpHIP_1EeScYo8tuJyy0A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_EvpHIf_1EeScYo8tuJyy0A" name="delete elements from general state machine" type="_xdObQP_0EeScYo8tuJyy0A" association="_EvogEP_1EeScYo8tuJyy0A"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_EvpHIv_1EeScYo8tuJyy0A" name="user" type="_B0KNcP_1EeScYo8tuJyy0A" association="_EvogEP_1EeScYo8tuJyy0A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_FkGp8P_1EeScYo8tuJyy0A" name="" memberEnd="_FkHRAv_1EeScYo8tuJyy0A _FkH4EP_1EeScYo8tuJyy0A">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_FkHRAP_1EeScYo8tuJyy0A" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_FkHRAf_1EeScYo8tuJyy0A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_FkHRAv_1EeScYo8tuJyy0A" name="lay out elements in general state machine" type="_zJRGUP_0EeScYo8tuJyy0A" association="_FkGp8P_1EeScYo8tuJyy0A"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_FkH4EP_1EeScYo8tuJyy0A" name="user" type="_B0KNcP_1EeScYo8tuJyy0A" association="_FkGp8P_1EeScYo8tuJyy0A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_GJo_8P_1EeScYo8tuJyy0A" name="" memberEnd="_GJpnAP_1EeScYo8tuJyy0A _GJpnAf_1EeScYo8tuJyy0A">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_GJo_8f_1EeScYo8tuJyy0A" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_GJo_8v_1EeScYo8tuJyy0A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_GJpnAP_1EeScYo8tuJyy0A" name="hide elements in general state machine" type="_226cwP_0EeScYo8tuJyy0A" association="_GJo_8P_1EeScYo8tuJyy0A"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_GJpnAf_1EeScYo8tuJyy0A" name="user" type="_B0KNcP_1EeScYo8tuJyy0A" association="_GJo_8P_1EeScYo8tuJyy0A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_GuxtUP_1EeScYo8tuJyy0A" name="" memberEnd="_GuyUYf_1EeScYo8tuJyy0A _GuyUYv_1EeScYo8tuJyy0A">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_GuxtUf_1EeScYo8tuJyy0A" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_GuyUYP_1EeScYo8tuJyy0A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_GuyUYf_1EeScYo8tuJyy0A" name="add elements to special state machine" type="_5w1QMP_0EeScYo8tuJyy0A" association="_GuxtUP_1EeScYo8tuJyy0A"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_GuyUYv_1EeScYo8tuJyy0A" name="user" type="_B0KNcP_1EeScYo8tuJyy0A" association="_GuxtUP_1EeScYo8tuJyy0A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_HgO_cP_1EeScYo8tuJyy0A" name="" memberEnd="_HgPmgv_1EeScYo8tuJyy0A _HgPmg__1EeScYo8tuJyy0A">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_HgPmgP_1EeScYo8tuJyy0A" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_HgPmgf_1EeScYo8tuJyy0A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_HgPmgv_1EeScYo8tuJyy0A" name="lay out elements in special state machine" type="__JdhwP_0EeScYo8tuJyy0A" association="_HgO_cP_1EeScYo8tuJyy0A"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_HgPmg__1EeScYo8tuJyy0A" name="user" type="_B0KNcP_1EeScYo8tuJyy0A" association="_HgO_cP_1EeScYo8tuJyy0A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_ZPkSgP_2EeScYo8tuJyy0A" client="_BwcAgP_0EeScYo8tuJyy0A" supplier="_H3xwAP_lEeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_PQN4AP_3EeScYo8tuJyy0A" client="_xdObQP_0EeScYo8tuJyy0A" supplier="_H3xwAP_lEeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_vHLCgP_3EeScYo8tuJyy0A" client="_zJRGUP_0EeScYo8tuJyy0A" supplier="_e-QjYP_lEeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_1OBsAP_3EeScYo8tuJyy0A" client="_226cwP_0EeScYo8tuJyy0A" supplier="_e-QjYP_lEeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_8iwBYP_4EeScYo8tuJyy0A" client="_5w1QMP_0EeScYo8tuJyy0A" supplier="_NlpXIP_4EeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_-hv6IP_3EeScYo8tuJyy0A" client="__JdhwP_0EeScYo8tuJyy0A" supplier="_lWa_UP_lEeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Actor" xmi:id="_UobeUACxEeWnE_cMzyyIKA" name="Editor"/>
+ <packagedElement xmi:type="uml:Association" xmi:id="_mQ37sACxEeWnE_cMzyyIKA" memberEnd="_mQ4iwACxEeWnE_cMzyyIKA _mQ4iwQCxEeWnE_cMzyyIKA">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_mQ37sQCxEeWnE_cMzyyIKA" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_mQ37sgCxEeWnE_cMzyyIKA" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_mQ4iwACxEeWnE_cMzyyIKA" name="initialize synchronization" type="_J0AScACxEeWnE_cMzyyIKA" association="_mQ37sACxEeWnE_cMzyyIKA"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_mQ4iwQCxEeWnE_cMzyyIKA" name="editor" type="_UobeUACxEeWnE_cMzyyIKA" association="_mQ37sACxEeWnE_cMzyyIKA"/>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Model" xmi:id="_y3pENgCLEeWudc8agGQ04Q" name="Design">
+ <packagedElement xmi:type="uml:Realization" xmi:id="_OjDxoACoEeWnE_cMzyyIKA" client="_AtaF4ACnEeWnE_cMzyyIKA _DEZLYACnEeWnE_cMzyyIKA _Jxw48ADAEeWt3cohpcF8rA" supplier="_hTJT4AClEeWnE_cMzyyIKA"/>
+ <packagedElement xmi:type="uml:Realization" xmi:id="_ndmjoACoEeWnE_cMzyyIKA" client="_hKj4QACoEeWnE_cMzyyIKA" supplier="_i-pMYAClEeWnE_cMzyyIKA"/>
+ <packagedElement xmi:type="uml:Component" xmi:id="_hTJT4AClEeWnE_cMzyyIKA" name="org.eclipse.papyrus.infra.sync">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_6WKFYAClEeWnE_cMzyyIKA" annotatedElement="_hTJT4AClEeWnE_cMzyyIKA">
+ <body>The core generic synchronization framework. Provides the base abstractions and
+support for synchronization of EMF-based model elements.</body>
+ </ownedComment>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Component" xmi:id="_i-pMYAClEeWnE_cMzyyIKA" name="org.eclipse.papyrus.infra.gmfdiag.common">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_M5nZgACmEeWnE_cMzyyIKA" annotatedElement="_i-pMYAClEeWnE_cMzyyIKA">
+ <body>An extension of the synchronization framework that provides support for
+synchronization of GMF-based diagrams as implemented by EditParts.
+Provides specific synchronization features for:
+&lt;ul>
+&lt;li>nested node edit-parts&lt;/li>
+&lt;li>incoming and outgoing connection edit-parts on nodes&lt;/li>
+&lt;li>position of node edit-parts&lt;/li>
+&lt;li>size of node edit-parts&lt;/li>
+&lt;/ul></body>
+ </ownedComment>
+ <packagedElement xmi:type="uml:Usage" xmi:id="_q-QHQAClEeWnE_cMzyyIKA" client="_i-pMYAClEeWnE_cMzyyIKA" supplier="_hTJT4AClEeWnE_cMzyyIKA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Component" xmi:id="_murvgAClEeWnE_cMzyyIKA" name="org.eclipse.papyrus.umlrt.ui">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_Xd0YEACmEeWnE_cMzyyIKA" annotatedElement="_murvgAClEeWnE_cMzyyIKA">
+ <body>Specific implementations of synchronization triggers, registries, buckets, and features for
+semantics of redefining Capsule state machines and visualization of redefining capsule
+state machines in state machine diagrams.</body>
+ </ownedComment>
+ <packagedElement xmi:type="uml:Usage" xmi:id="_ppcQcAClEeWnE_cMzyyIKA" client="_murvgAClEeWnE_cMzyyIKA" supplier="_hTJT4AClEeWnE_cMzyyIKA"/>
+ <packagedElement xmi:type="uml:Usage" xmi:id="_qOZ-sAClEeWnE_cMzyyIKA" client="_murvgAClEeWnE_cMzyyIKA" supplier="_i-pMYAClEeWnE_cMzyyIKA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Package" xmi:id="_AtaF4ACnEeWnE_cMzyyIKA" name="org.eclipse.papyrus.infra.sync">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_uUrhcACuEeWnE_cMzyyIKA" annotatedElement="_AtaF4ACnEeWnE_cMzyyIKA">
+ <body>Core abstractions of the synchronization framework, including integration with
+EMF Transactions for synchronization of EMF model elements using trigger
+commands to implement follow-up changes to synchronized objects in reaction
+to changes observed (as Notifications) in source objects.</body>
+ </ownedComment>
+ <packagedElement xmi:type="uml:Class" xmi:id="_sVtGwADDEeWt3cohpcF8rA" name="SyncFeature">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_CkBmQADIEeWt3cohpcF8rA" annotatedElement="_sVtGwADDEeWt3cohpcF8rA">
+ <body>A synchronization primitive representing a feature, possibly something
+complex or derived, comprising any number of actual features in EMF
+or Java terms, of the &quot;back-end&quot; object type T that is to be synchronized
+from one or more other objects of the same kind matching the same
+(or equivalent) &quot;front-end&quot; model M, on receipt from the source object
+of some message of type X.</body>
+ </ownedComment>
+ <ownedTemplateSignature xmi:type="uml:RedefinableTemplateSignature" xmi:id="_tv7CAADDEeWt3cohpcF8rA" name="RedefinableTemplateSignature1" parameter="_uT-xUADDEeWt3cohpcF8rA _ztOt8ADDEeWt3cohpcF8rA _43dXIADDEeWt3cohpcF8rA">
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_uT-xUADDEeWt3cohpcF8rA" parameteredElement="_yu2aIADDEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_yu2aIADDEeWt3cohpcF8rA" name="M" templateParameter="_uT-xUADDEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_ztOt8ADDEeWt3cohpcF8rA" parameteredElement="_3vj68ADDEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_3vj68ADDEeWt3cohpcF8rA" name="T" templateParameter="_ztOt8ADDEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_43dXIADDEeWt3cohpcF8rA" parameteredElement="_6qn94ADDEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_6qn94ADDEeWt3cohpcF8rA" name="X" templateParameter="_43dXIADDEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ </ownedTemplateSignature>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_jJG-4ADEEeWt3cohpcF8rA" name="SyncBucket">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_XKJyMADHEeWt3cohpcF8rA" annotatedElement="_jJG-4ADEEeWt3cohpcF8rA">
+ <body>A group of synchronization items that all match different &quot;back-end&quot; objects
+of type T with the same (or logically equivalent; the matching is flexible)
+&quot;front-end&quot; model element of type M. A bucket coordinates synchronization
+of any number of featuers from the back-end of a source item that has
+changed to the back-ends of the other items in the bucket.</body>
+ </ownedComment>
+ <ownedTemplateSignature xmi:type="uml:RedefinableTemplateSignature" xmi:id="_jJG-4QDEEeWt3cohpcF8rA" name="RedefinableTemplateSignature1" parameter="_jJG-4gDEEeWt3cohpcF8rA _jJG-5ADEEeWt3cohpcF8rA _jJG-5gDEEeWt3cohpcF8rA">
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_jJG-4gDEEeWt3cohpcF8rA" parameteredElement="_jJG-4wDEEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_jJG-4wDEEeWt3cohpcF8rA" name="M" templateParameter="_jJG-4gDEEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_jJG-5ADEEeWt3cohpcF8rA" parameteredElement="_jJG-5QDEEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_jJG-5QDEEeWt3cohpcF8rA" name="T" templateParameter="_jJG-5ADEEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_jJG-5gDEEeWt3cohpcF8rA" parameteredElement="_jJG-5wDEEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_jJG-5wDEEeWt3cohpcF8rA" name="X" templateParameter="_jJG-5gDEEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ </ownedTemplateSignature>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_D8fVYgDFEeWt3cohpcF8rA" name="item" type="_jW6KUADEEeWt3cohpcF8rA" aggregation="composite" association="_D8euUADFEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_L8obwADFEeWt3cohpcF8rA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_L8pp4ADFEeWt3cohpcF8rA" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_jFmQggDHEeWt3cohpcF8rA" name="feature" type="_sVtGwADDEeWt3cohpcF8rA" aggregation="composite" association="_jFlpcADHEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_m6YJsADHEeWt3cohpcF8rA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_m6ZX0ADHEeWt3cohpcF8rA" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_jW6KUADEEeWt3cohpcF8rA" name="SyncItem">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_7gzQkADGEeWt3cohpcF8rA" annotatedElement="_jW6KUADEEeWt3cohpcF8rA">
+ <body>A pairing of a &quot;front-end&quot; model element (of type M) with a &quot;back-end&quot;
+object (of type T) that is synchronized from some other back-end paired
+with the same front-end.</body>
+ </ownedComment>
+ <ownedTemplateSignature xmi:type="uml:RedefinableTemplateSignature" xmi:id="_jW6KUQDEEeWt3cohpcF8rA" name="RedefinableTemplateSignature1" parameter="_jW6KUgDEEeWt3cohpcF8rA _jW6KVADEEeWt3cohpcF8rA">
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_jW6KUgDEEeWt3cohpcF8rA" parameteredElement="_jW6KUwDEEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_jW6KUwDEEeWt3cohpcF8rA" name="M" templateParameter="_jW6KUgDEEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_jW6KVADEEeWt3cohpcF8rA" parameteredElement="_jW6KVQDEEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_jW6KVQDEEeWt3cohpcF8rA" name="T" templateParameter="_jW6KVADEEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ </ownedTemplateSignature>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_kHf5wADEEeWt3cohpcF8rA" name="SyncRegistry">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_cUf6sADIEeWt3cohpcF8rA" annotatedElement="_kHf5wADEEeWt3cohpcF8rA">
+ <body>A registry of synchronization buckets of the same type. All of the buckets in
+a registry synchronize the same features of the back-ends of type T matching
+front-ends of type M, on receipt of messages of type X. An instance of the
+synchronization service (which is unique in a Papyrus editor) has an unique
+SyncRegistry for every combination of actual front-end, back-end, and message
+types.</body>
+ </ownedComment>
+ <ownedTemplateSignature xmi:type="uml:RedefinableTemplateSignature" xmi:id="_kHf5wQDEEeWt3cohpcF8rA" name="RedefinableTemplateSignature1" parameter="_kHf5wgDEEeWt3cohpcF8rA _kHf5xADEEeWt3cohpcF8rA _kHf5xgDEEeWt3cohpcF8rA">
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_kHf5wgDEEeWt3cohpcF8rA" parameteredElement="_kHf5wwDEEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_kHf5wwDEEeWt3cohpcF8rA" name="M" templateParameter="_kHf5wgDEEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_kHf5xADEEeWt3cohpcF8rA" parameteredElement="_kHf5xQDEEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_kHf5xQDEEeWt3cohpcF8rA" name="T" templateParameter="_kHf5xADEEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_kHf5xgDEEeWt3cohpcF8rA" parameteredElement="_kHf5xwDEEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_kHf5xwDEEeWt3cohpcF8rA" name="X" templateParameter="_kHf5xgDEEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ </ownedTemplateSignature>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_u6uy0QDEEeWt3cohpcF8rA" name="bucket" type="_jJG-4ADEEeWt3cohpcF8rA" aggregation="composite" association="_u6uLwADEEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_2nUEAADEEeWt3cohpcF8rA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_2nVSIADEEeWt3cohpcF8rA" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_u6uLwADEEeWt3cohpcF8rA" memberEnd="_u6uy0QDEEeWt3cohpcF8rA _u6vZ4ADEEeWt3cohpcF8rA">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_u6uLwQDEEeWt3cohpcF8rA" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_u6uy0ADEEeWt3cohpcF8rA" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_u6vZ4ADEEeWt3cohpcF8rA" name="syncregistry" type="_kHf5wADEEeWt3cohpcF8rA" association="_u6uLwADEEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_D8euUADFEeWt3cohpcF8rA" memberEnd="_D8fVYgDFEeWt3cohpcF8rA _D8f8cADFEeWt3cohpcF8rA">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_D8fVYADFEeWt3cohpcF8rA" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_D8fVYQDFEeWt3cohpcF8rA" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_D8f8cADFEeWt3cohpcF8rA" name="syncbucket" type="_jJG-4ADEEeWt3cohpcF8rA" association="_D8euUADFEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ck51kADFEeWt3cohpcF8rA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ck7DsADFEeWt3cohpcF8rA" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_O9-F0ADFEeWt3cohpcF8rA" name="MasterSlaveSyncBucket">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_prMPAADIEeWt3cohpcF8rA" annotatedElement="_O9-F0ADFEeWt3cohpcF8rA">
+ <body>A specialized synchronization bucket that implements a master-slave
+synchronization pattern. A single SyncItem is identified as the master
+and its back-end is observed for changes, which are pushed to the
+back-ends of all other SyncItems in the bucket (the slaves).</body>
+ </ownedComment>
+ <ownedTemplateSignature xmi:type="uml:RedefinableTemplateSignature" xmi:id="_O9-F0QDFEeWt3cohpcF8rA" name="RedefinableTemplateSignature1" parameter="_O9-F0gDFEeWt3cohpcF8rA _O9-F1ADFEeWt3cohpcF8rA _O9-F1gDFEeWt3cohpcF8rA">
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_O9-F0gDFEeWt3cohpcF8rA" parameteredElement="_O9-F0wDFEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_O9-F0wDFEeWt3cohpcF8rA" name="M" templateParameter="_O9-F0gDFEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_O9-F1ADFEeWt3cohpcF8rA" parameteredElement="_O9-F1QDFEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_O9-F1QDFEeWt3cohpcF8rA" name="T" templateParameter="_O9-F1ADFEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_O9-F1gDFEeWt3cohpcF8rA" parameteredElement="_O9-F1wDFEeWt3cohpcF8rA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_O9-F1wDFEeWt3cohpcF8rA" name="X" templateParameter="_O9-F1gDFEeWt3cohpcF8rA"/>
+ </ownedParameter>
+ </ownedTemplateSignature>
+ <generalization xmi:type="uml:Generalization" xmi:id="_jIihsADFEeWt3cohpcF8rA" general="_jJG-4ADEEeWt3cohpcF8rA"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_O9-F2ADFEeWt3cohpcF8rA" name="item" type="_jW6KUADEEeWt3cohpcF8rA" aggregation="composite">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_O9-F2QDFEeWt3cohpcF8rA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_O9-F2gDFEeWt3cohpcF8rA" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_WWRJEQDFEeWt3cohpcF8rA" name="master" type="_jW6KUADEEeWt3cohpcF8rA" aggregation="composite" association="_WWQiAADFEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_WWQiAADFEeWt3cohpcF8rA" memberEnd="_WWRJEQDFEeWt3cohpcF8rA _WWSXMADFEeWt3cohpcF8rA">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WWQiAQDFEeWt3cohpcF8rA" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_WWRJEADFEeWt3cohpcF8rA" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_WWSXMADFEeWt3cohpcF8rA" name="masterslavesyncbucket" type="_O9-F0ADFEeWt3cohpcF8rA" association="_WWQiAADFEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Z1isUADFEeWt3cohpcF8rA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Z1j6cADFEeWt3cohpcF8rA" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_HH6TEADGEeWt3cohpcF8rA" name="EMFListener">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_A9NkAADJEeWt3cohpcF8rA" annotatedElement="_HH6TEADGEeWt3cohpcF8rA">
+ <body>A ResourceSetLIstener on the Papyrus editor's TransactionalEditingDomain
+that observes, via EMFDispatch objects, changes in the &quot;back-end&quot; objects
+of SyncItems in a bucket. When changes are observed, they are dispatched
+to the appropriate SyncFeatures to propagate them (as appropriate) to the
+back-ends of other items in the bucket.</body>
+ </ownedComment>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_NnDgwgDGEeWt3cohpcF8rA" name="dispatch" type="_IShFAADGEeWt3cohpcF8rA" aggregation="composite" association="_NnC5sADGEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_b777oADGEeWt3cohpcF8rA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_b79JwADGEeWt3cohpcF8rA" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_IShFAADGEeWt3cohpcF8rA" name="EMFDispatch">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_KZB-MADJEeWt3cohpcF8rA" annotatedElement="_IShFAADGEeWt3cohpcF8rA">
+ <body>A mediator of the propagation of synchronizable feature changes
+from sources to targets when messages are received from the sources
+that trigger synchronization. In the EMF context, these messages are
+Notifications.</body>
+ </ownedComment>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_NnC5sADGEeWt3cohpcF8rA" memberEnd="_NnDgwgDGEeWt3cohpcF8rA _NnEH0ADGEeWt3cohpcF8rA">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_NnDgwADGEeWt3cohpcF8rA" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_NnDgwQDGEeWt3cohpcF8rA" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_NnEH0ADGEeWt3cohpcF8rA" name="emflistener" type="_HH6TEADGEeWt3cohpcF8rA" association="_NnC5sADGEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Usage" xmi:id="_Vq2_IADGEeWt3cohpcF8rA" name="propagates" client="_sVtGwADDEeWt3cohpcF8rA" supplier="_IShFAADGEeWt3cohpcF8rA"/>
+ <packagedElement xmi:type="uml:Association" xmi:id="_jFlpcADHEeWt3cohpcF8rA" memberEnd="_jFmQggDHEeWt3cohpcF8rA _jFm3kADHEeWt3cohpcF8rA">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_jFmQgADHEeWt3cohpcF8rA" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_jFmQgQDHEeWt3cohpcF8rA" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_jFm3kADHEeWt3cohpcF8rA" name="syncbucket" type="_jJG-4ADEEeWt3cohpcF8rA" association="_jFlpcADHEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Collaboration" xmi:id="_FNBpcALkEeWy2L7kEYTJVw" name="Synchronization">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_SmVz8ALkEeWy2L7kEYTJVw" name="emfListener" type="_HH6TEADGEeWt3cohpcF8rA"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_U96IQALkEeWy2L7kEYTJVw" name="emfDispatch" type="_IShFAADGEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_f3uKcALkEeWy2L7kEYTJVw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_f3uxgALkEeWy2L7kEYTJVw" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XQkHYALkEeWy2L7kEYTJVw" name="syncItem" type="_jW6KUADEEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_dcpPIALkEeWy2L7kEYTJVw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_dcp2MALkEeWy2L7kEYTJVw" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_X-insALkEeWy2L7kEYTJVw" name="syncRegistry" type="_kHf5wADEEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_fLevgALkEeWy2L7kEYTJVw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_fLfWkALkEeWy2L7kEYTJVw" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Ye1RUALkEeWy2L7kEYTJVw" name="syncBucket" type="_jJG-4ADEEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_eIOiwALkEeWy2L7kEYTJVw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_eIPJ0ALkEeWy2L7kEYTJVw" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Y53ngALkEeWy2L7kEYTJVw" name="syncFeature" type="_sVtGwADDEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_cpTGoALkEeWy2L7kEYTJVw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_cpUUwALkEeWy2L7kEYTJVw" value="*"/>
+ </ownedAttribute>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_gtxBoALkEeWy2L7kEYTJVw">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_gt0sAALkEeWy2L7kEYTJVw" role="_SmVz8ALkEeWy2L7kEYTJVw"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_gt1TEALkEeWy2L7kEYTJVw" role="_U96IQALkEeWy2L7kEYTJVw"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_ifsSQALkEeWy2L7kEYTJVw">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_ifs5UALkEeWy2L7kEYTJVw" role="_X-insALkEeWy2L7kEYTJVw"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_ifs5UQLkEeWy2L7kEYTJVw" role="_Ye1RUALkEeWy2L7kEYTJVw"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_jKlpYALkEeWy2L7kEYTJVw">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_jKmQcALkEeWy2L7kEYTJVw" role="_Ye1RUALkEeWy2L7kEYTJVw"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_jKmQcQLkEeWy2L7kEYTJVw" role="_Y53ngALkEeWy2L7kEYTJVw"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_jzDXkALkEeWy2L7kEYTJVw">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_jzD-oALkEeWy2L7kEYTJVw" role="_Ye1RUALkEeWy2L7kEYTJVw"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_jzD-oQLkEeWy2L7kEYTJVw" role="_XQkHYALkEeWy2L7kEYTJVw"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_gH8wcAM0EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_gH9XgAM0EeWWbMjTqzYc1A" role="_U96IQALkEeWy2L7kEYTJVw"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_gH9XgQM0EeWWbMjTqzYc1A" role="_Y53ngALkEeWy2L7kEYTJVw"/>
+ </ownedConnector>
+ <ownedBehavior xmi:type="uml:Interaction" xmi:id="_mC8rsALmEeWy2L7kEYTJVw" name="Synchronize Model Elements">
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_A4nbsALpEeW1-e4oerqxMg" name="emfListener" represents="_SmVz8ALkEeWy2L7kEYTJVw" coveredBy="_ZVJNQALvEeW1-e4oerqxMg _3RVUMALvEeW1-e4oerqxMg"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_xO2UsALsEeW1-e4oerqxMg" name="emfDispatch" represents="_U96IQALkEeWy2L7kEYTJVw" coveredBy="_ZVJ0UALvEeW1-e4oerqxMg _3RUtIALvEeW1-e4oerqxMg _pA_bEALvEeW1-e4oerqxMg _dt_c0ALvEeW1-e4oerqxMg"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_QU94IALtEeW1-e4oerqxMg" name="syncRegistry" represents="_X-insALkEeWy2L7kEYTJVw" coveredBy="_vtl18ALvEeW1-e4oerqxMg"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_J_Cl8ALvEeW1-e4oerqxMg" name="syncBucket" represents="_Ye1RUALkEeWy2L7kEYTJVw" coveredBy="_pA_bEQLvEeW1-e4oerqxMg _vtlO4ALvEeW1-e4oerqxMg _fp-3gAMzEeWWbMjTqzYc1A _vgs4kAMzEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_P5ytIALvEeW1-e4oerqxMg" name="syncFeature" represents="_Y53ngALkEeWy2L7kEYTJVw" coveredBy="_fp_ekAMzEeWWbMjTqzYc1A _dt-1wALvEeW1-e4oerqxMg _vgtfoAMzEeWWbMjTqzYc1A _rrkK8ALvEeW1-e4oerqxMg"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_Rhhf8ALvEeW1-e4oerqxMg" name="syncItem" represents="_XQkHYALkEeWy2L7kEYTJVw" coveredBy="_rrkyAALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_ZVJNQALvEeW1-e4oerqxMg" name="Message0Send0" covered="_A4nbsALpEeW1-e4oerqxMg" message="_ZUlMkALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_ZVJ0UALvEeW1-e4oerqxMg" name="Message0Recv0" covered="_xO2UsALsEeW1-e4oerqxMg" message="_ZUlMkALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_dt-1wALvEeW1-e4oerqxMg" name="Message0Send1" covered="_P5ytIALvEeW1-e4oerqxMg" message="_dttI8ALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_dt_c0ALvEeW1-e4oerqxMg" name="Message0Recv1" covered="_xO2UsALsEeW1-e4oerqxMg" message="_dttI8ALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_pA_bEALvEeW1-e4oerqxMg" name="Message0Send2" covered="_xO2UsALsEeW1-e4oerqxMg" message="_pAz04ALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_pA_bEQLvEeW1-e4oerqxMg" name="Message0Recv2" covered="_J_Cl8ALvEeW1-e4oerqxMg" message="_pAz04ALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_rrkK8ALvEeW1-e4oerqxMg" name="Message0Send3" covered="_P5ytIALvEeW1-e4oerqxMg" message="_rrYkwALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_rrkyAALvEeW1-e4oerqxMg" name="Message0Recv3" covered="_Rhhf8ALvEeW1-e4oerqxMg" message="_rrYkwALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_vtlO4ALvEeW1-e4oerqxMg" name="Message0Send4" covered="_J_Cl8ALvEeW1-e4oerqxMg" message="_vta20ALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_vtl18ALvEeW1-e4oerqxMg" name="Message0Recv4" covered="_QU94IALtEeW1-e4oerqxMg" message="_vta20ALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3RUtIALvEeW1-e4oerqxMg" name="Message0Send5" covered="_xO2UsALsEeW1-e4oerqxMg" message="_3RFckALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3RVUMALvEeW1-e4oerqxMg" name="Message0Recv5" covered="_A4nbsALpEeW1-e4oerqxMg" message="_3RFckALvEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_fp-3gAMzEeWWbMjTqzYc1A" name="Message0Send6" covered="_J_Cl8ALvEeW1-e4oerqxMg" message="_fp27sAMzEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_fp_ekAMzEeWWbMjTqzYc1A" name="Message0Recv6" covered="_P5ytIALvEeW1-e4oerqxMg" message="_fp27sAMzEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_vgs4kAMzEeWWbMjTqzYc1A" name="Message0Send7" covered="_J_Cl8ALvEeW1-e4oerqxMg" message="_vgkVsAMzEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_vgtfoAMzEeWWbMjTqzYc1A" name="Message0Recv7" covered="_P5ytIALvEeW1-e4oerqxMg" message="_vgkVsAMzEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_ZUlMkALvEeW1-e4oerqxMg" name="5:notifications" receiveEvent="_ZVJ0UALvEeW1-e4oerqxMg" sendEvent="_ZVJNQALvEeW1-e4oerqxMg"/>
+ <message xmi:type="uml:Message" xmi:id="_dttI8ALvEeW1-e4oerqxMg" name="3:create" receiveEvent="_dt_c0ALvEeW1-e4oerqxMg" sendEvent="_dt-1wALvEeW1-e4oerqxMg"/>
+ <message xmi:type="uml:Message" xmi:id="_pAz04ALvEeW1-e4oerqxMg" name="6:propagate" receiveEvent="_pA_bEQLvEeW1-e4oerqxMg" sendEvent="_pA_bEALvEeW1-e4oerqxMg"/>
+ <message xmi:type="uml:Message" xmi:id="_rrYkwALvEeW1-e4oerqxMg" name="8:synchronize" receiveEvent="_rrkyAALvEeW1-e4oerqxMg" sendEvent="_rrkK8ALvEeW1-e4oerqxMg"/>
+ <message xmi:type="uml:Message" xmi:id="_vta20ALvEeW1-e4oerqxMg" name="1:register" receiveEvent="_vtl18ALvEeW1-e4oerqxMg" sendEvent="_vtlO4ALvEeW1-e4oerqxMg"/>
+ <message xmi:type="uml:Message" xmi:id="_3RFckALvEeW1-e4oerqxMg" name="4:add" receiveEvent="_3RVUMALvEeW1-e4oerqxMg" sendEvent="_3RUtIALvEeW1-e4oerqxMg"/>
+ <message xmi:type="uml:Message" xmi:id="_fp27sAMzEeWWbMjTqzYc1A" name="2:add" receiveEvent="_fp_ekAMzEeWWbMjTqzYc1A" sendEvent="_fp-3gAMzEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_vgkVsAMzEeWWbMjTqzYc1A" name="7:synchronize" receiveEvent="_vgtfoAMzEeWWbMjTqzYc1A" sendEvent="_vgs4kAMzEeWWbMjTqzYc1A"/>
+ </ownedBehavior>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Package" xmi:id="_DEZLYACnEeWnE_cMzyyIKA" name="org.eclipse.papyrus.infra.sync.service">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_5c2IsACuEeWnE_cMzyyIKA" annotatedElement="_DEZLYACnEeWnE_cMzyyIKA">
+ <body>A Papyrus registered Service that manages the lifecycle of synchronization,
+including the EMF transaction listener that reacts to changes and the
+application's synchronization triggers and registries.</body>
+ </ownedComment>
+ <packagedElement xmi:type="uml:Interface" xmi:id="_BDQZEACyEeWnE_cMzyyIKA" name="ISyncService">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_js_F0AC1EeWnE_cMzyyIKA" annotatedElement="_BDQZEACyEeWnE_cMzyyIKA">
+ <body>The synchronization service is a registered Papyrus Service that
+manages model-to-model and diagram-to-diagram synchronization
+within the context of an editor. It manages the EMF transaction
+listener that triggers synchronization operations and it provides the
+API for triggering the configuration of synchronization on objects
+according to registered ISyncTriggers.</body>
+ </ownedComment>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_2Gde4ACyEeWnE_cMzyyIKA" name="run" raisedException="_5aY4UACzEeWnE_cMzyyIKA">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_zyyrwAC1EeWnE_cMzyyIKA" annotatedElement="_2Gde4ACyEeWnE_cMzyyIKA">
+ <body>Runs a SyncServiceRunnable operation in the context of the service. This context
+is required for all manipulations of the synchronization framework, including
+creation and association of SyncRegistry instances, SyncBuckets, and SyncItems.</body>
+ </ownedComment>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_7AcsoACyEeWnE_cMzyyIKA" name="operation" type="_KiQqIACyEeWnE_cMzyyIKA" effect="read"/>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_BXSdcAC0EeWnE_cMzyyIKA" type="_0Nk1MACzEeWnE_cMzyyIKA" direction="return"/>
+ <ownedTemplateSignature xmi:type="uml:TemplateSignature" xmi:id="_wvSwcACzEeWnE_cMzyyIKA" parameter="_x-Fe0ACzEeWnE_cMzyyIKA _4YTwQACzEeWnE_cMzyyIKA">
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_x-Fe0ACzEeWnE_cMzyyIKA" parameteredElement="_0Nk1MACzEeWnE_cMzyyIKA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_0Nk1MACzEeWnE_cMzyyIKA" name="V" templateParameter="_x-Fe0ACzEeWnE_cMzyyIKA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_4YTwQACzEeWnE_cMzyyIKA" parameteredElement="_5aY4UACzEeWnE_cMzyyIKA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_5aY4UACzEeWnE_cMzyyIKA" name="X" templateParameter="_4YTwQACzEeWnE_cMzyyIKA"/>
+ </ownedParameter>
+ </ownedTemplateSignature>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Interface" xmi:id="_CbCEUACyEeWnE_cMzyyIKA" name="ISyncTrigger">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_52WmIAC0EeWnE_cMzyyIKA" annotatedElement="_CbCEUACyEeWnE_cMzyyIKA">
+ <body>Synchronization triggers are registered on an the org.eclipse.papyrus.infra.sync.triggers
+extension point with enablement conditions that match objects on which they should fire.
+When a trigger fires, it provides a sync action that the synchronization runs. This sync
+action is expected to configure synchronization of the triggering object and/or &lt;em>cascade&lt;/em>
+the trigger to related objects.</body>
+ </ownedComment>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Interface" xmi:id="_E9y8AACyEeWnE_cMzyyIKA" name="ISyncAction">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_T887kAC1EeWnE_cMzyyIKA" annotatedElement="_E9y8AACyEeWnE_cMzyyIKA">
+ <body>An action provided by a synchronization trigger that usually either
+configures synchronization of the triggering object and/or cascade
+the trigger to related objects.</body>
+ </ownedComment>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_KiQqIACyEeWnE_cMzyyIKA" name="SyncServiceRunnable" isAbstract="true">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_cERccAC_EeWnc73YHF_Igw" annotatedElement="_KiQqIACyEeWnE_cMzyyIKA">
+ <body>An executable operation that is run in the context of an ISyncService.</body>
+ </ownedComment>
+ <ownedTemplateSignature xmi:type="uml:RedefinableTemplateSignature" xmi:id="_L09oIACyEeWnE_cMzyyIKA" name="RedefinableTemplateSignature1" parameter="_OKGTgACyEeWnE_cMzyyIKA _SuCYwACyEeWnE_cMzyyIKA">
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_OKGTgACyEeWnE_cMzyyIKA" parameteredElement="_RVX8sACyEeWnE_cMzyyIKA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_RVX8sACyEeWnE_cMzyyIKA" name="V" templateParameter="_OKGTgACyEeWnE_cMzyyIKA"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:ClassifierTemplateParameter" xmi:id="_SuCYwACyEeWnE_cMzyyIKA" parameteredElement="_UEgccACyEeWnE_cMzyyIKA">
+ <ownedParameteredElement xmi:type="uml:Class" xmi:id="_UEgccACyEeWnE_cMzyyIKA" name="X" templateParameter="_SuCYwACyEeWnE_cMzyyIKA"/>
+ </ownedParameter>
+ </ownedTemplateSignature>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_obm4cgCyEeWnE_cMzyyIKA" name="context" type="_BDQZEACyEeWnE_cMzyyIKA" association="_obmRYACyEeWnE_cMzyyIKA"/>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_da-wsAC_EeWnc73YHF_Igw" name="run">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_icIWYAC_EeWnc73YHF_Igw" name="syncService" type="_BDQZEACyEeWnE_cMzyyIKA" effect="read"/>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_obmRYACyEeWnE_cMzyyIKA" memberEnd="_obm4cgCyEeWnE_cMzyyIKA _obotoACyEeWnE_cMzyyIKA">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_obm4cACyEeWnE_cMzyyIKA" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_obm4cQCyEeWnE_cMzyyIKA" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_obotoACyEeWnE_cMzyyIKA" name="syncservicerunnable" type="_KiQqIACyEeWnE_cMzyyIKA" association="_obmRYACyEeWnE_cMzyyIKA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zNLkoACyEeWnE_cMzyyIKA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zNOA4ACyEeWnE_cMzyyIKA" value="*"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Usage" xmi:id="_WbM8IAC0EeWnE_cMzyyIKA" name="invoke" client="_BDQZEACyEeWnE_cMzyyIKA" supplier="_CbCEUACyEeWnE_cMzyyIKA"/>
+ <packagedElement xmi:type="uml:Usage" xmi:id="_eacDkAC0EeWnE_cMzyyIKA" name="provide" client="_CbCEUACyEeWnE_cMzyyIKA" supplier="_E9y8AACyEeWnE_cMzyyIKA"/>
+ <packagedElement xmi:type="uml:Usage" xmi:id="_go6tUAC0EeWnE_cMzyyIKA" name="run" client="_BDQZEACyEeWnE_cMzyyIKA" supplier="_E9y8AACyEeWnE_cMzyyIKA"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_8aHjYAC0EeWnE_cMzyyIKA" name="CascadeTriggers">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_KHxmMAC1EeWnE_cMzyyIKA" annotatedElement="_8aHjYAC0EeWnE_cMzyyIKA">
+ <body>A synchronization action that cascades the trigger to related objects.
+This causes triggers to be matched on those objects, and any triggers
+that do fire produce further actions that are evaluated to initialize
+synchronization (or induce more triggers).</body>
+ </ownedComment>
+ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="_IXISgAC2EeWnE_cMzyyIKA" client="_8aHjYAC0EeWnE_cMzyyIKA" supplier="_E9y8AACyEeWnE_cMzyyIKA" contract="_E9y8AACyEeWnE_cMzyyIKA"/>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Package" xmi:id="_Jxw48ADAEeWt3cohpcF8rA" name="org.eclipse.papyrus.infra.sync.policy">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_UW5EkADAEeWt3cohpcF8rA" annotatedElement="_Jxw48ADAEeWt3cohpcF8rA">
+ <body>API for definition of sync policies providing for synchronization override.</body>
+ </ownedComment>
+ <packagedElement xmi:type="uml:Interface" xmi:id="_rrfMcADAEeWt3cohpcF8rA" name="ISyncPolicy">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_q1cDUADCEeWt3cohpcF8rA" annotatedElement="_rrfMcADAEeWt3cohpcF8rA">
+ <body>A policy determining whether objects are excluded from synchronization of
+certain features that otherwise would be propagated to them from source objects.</body>
+ </ownedComment>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Interface" xmi:id="_tC0LwADAEeWt3cohpcF8rA" name="ISyncPolicyDelegate">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_NmV2cADDEeWt3cohpcF8rA" annotatedElement="_tC0LwADAEeWt3cohpcF8rA">
+ <body>A synchronization policy delegate for a specific synchronization feature.</body>
+ </ownedComment>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_v56UsADAEeWt3cohpcF8rA" name="SyncPolicyDelegate" isAbstract="true">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_d6VCUADDEeWt3cohpcF8rA" annotatedElement="_v56UsADAEeWt3cohpcF8rA">
+ <body>Abstract implementation of a sync policy delegate for some feature.
+Subclasses are required to determine whether the feature is
+synchronized for some given target object and also to react to
+changes introduced by the user in a target object to disable
+synchronization of the feature (if appropriate).</body>
+ </ownedComment>
+ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="_yffP0ADAEeWt3cohpcF8rA" client="_v56UsADAEeWt3cohpcF8rA" supplier="_tC0LwADAEeWt3cohpcF8rA" contract="_tC0LwADAEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Usage" xmi:id="_0G55kADAEeWt3cohpcF8rA" name="delegates" client="_3hd78ADAEeWt3cohpcF8rA" supplier="_tC0LwADAEeWt3cohpcF8rA"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_3hd78ADAEeWt3cohpcF8rA" name="DefaultSyncPolicy">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_I380sADDEeWt3cohpcF8rA" annotatedElement="_3hd78ADAEeWt3cohpcF8rA">
+ <body>Default realization of the ISyncPolicy interface. Clients of the synchronization
+service may install a policy of their own to replace it.
+
+This default sync policy delegates policy queries to registered policy delegates.</body>
+ </ownedComment>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_zt4gIgDBEeWt3cohpcF8rA" name="registry" type="_603mYADAEeWt3cohpcF8rA" association="_zt35EADBEeWt3cohpcF8rA"/>
+ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="_5P9eEADAEeWt3cohpcF8rA" client="_3hd78ADAEeWt3cohpcF8rA" supplier="_rrfMcADAEeWt3cohpcF8rA" contract="_rrfMcADAEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Interface" xmi:id="_603mYADAEeWt3cohpcF8rA" name="ISyncPolicyDelegate.Registry">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_QcyfIADDEeWt3cohpcF8rA" annotatedElement="_603mYADAEeWt3cohpcF8rA">
+ <body>A registry of policy delegates by synchronization feature.</body>
+ </ownedComment>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_e30QMADBEeWt3cohpcF8rA" name="delegate" type="_tC0LwADAEeWt3cohpcF8rA" association="_e3wl0ADBEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_pnv9oADBEeWt3cohpcF8rA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_pnzoAADBEeWt3cohpcF8rA" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_e3wl0ADBEeWt3cohpcF8rA" memberEnd="_e30QMADBEeWt3cohpcF8rA _e32scADBEeWt3cohpcF8rA">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_e3ybAADBEeWt3cohpcF8rA" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_e3ybAQDBEeWt3cohpcF8rA" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_e32scADBEeWt3cohpcF8rA" type="_603mYADAEeWt3cohpcF8rA" association="_e3wl0ADBEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_zt35EADBEeWt3cohpcF8rA" memberEnd="_zt4gIgDBEeWt3cohpcF8rA _zt5HMADBEeWt3cohpcF8rA">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_zt4gIADBEeWt3cohpcF8rA" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_zt4gIQDBEeWt3cohpcF8rA" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_zt5HMADBEeWt3cohpcF8rA" type="_3hd78ADAEeWt3cohpcF8rA" association="_zt35EADBEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Dependency" xmi:id="_FqOw8ADCEeWt3cohpcF8rA" name="registers" client="_v56UsADAEeWt3cohpcF8rA" supplier="_603mYADAEeWt3cohpcF8rA"/>
+ <packagedElement xmi:type="uml:Dependency" xmi:id="_I0sP4ADEEeWt3cohpcF8rA" name="governs" client="_tC0LwADAEeWt3cohpcF8rA" supplier="_sVtGwADDEeWt3cohpcF8rA"/>
+ <packagedElement xmi:type="uml:Collaboration" xmi:id="_3_HiEAMBEeW1-e4oerqxMg" name="Synchronization Overrides">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_3_HiEQMBEeW1-e4oerqxMg" name="emfListener" type="_HH6TEADGEeWt3cohpcF8rA"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_3_HiEgMBEeW1-e4oerqxMg" name="emfDispatch" type="_IShFAADGEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_3_HiEwMBEeW1-e4oerqxMg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_3_HiFAMBEeW1-e4oerqxMg" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_3_HiFQMBEeW1-e4oerqxMg" name="syncItem" type="_jW6KUADEEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_3_HiFgMBEeW1-e4oerqxMg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_3_HiFwMBEeW1-e4oerqxMg" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_3_HiGAMBEeW1-e4oerqxMg" name="syncRegistry" type="_kHf5wADEEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_3_HiGQMBEeW1-e4oerqxMg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_3_HiGgMBEeW1-e4oerqxMg" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_3_HiGwMBEeW1-e4oerqxMg" name="syncBucket" type="_jJG-4ADEEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_3_HiHAMBEeW1-e4oerqxMg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_3_HiHQMBEeW1-e4oerqxMg" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_3_HiHgMBEeW1-e4oerqxMg" name="syncFeature" type="_sVtGwADDEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_3_HiHwMBEeW1-e4oerqxMg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_3_HiIAMBEeW1-e4oerqxMg" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_tGurIAMgEeWWbMjTqzYc1A" name="syncPolicy" type="_3hd78ADAEeWt3cohpcF8rA"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_xDKrgAMgEeWWbMjTqzYc1A" name="syncPolicyDelegate" type="_v56UsADAEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ElL5oAMhEeWWbMjTqzYc1A"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ElMgsAMhEeWWbMjTqzYc1A" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_z2B0sAMgEeWWbMjTqzYc1A" name="delegateRegistry" type="_603mYADAEeWt3cohpcF8rA"/>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_3_HiIQMBEeW1-e4oerqxMg">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_3_HiIgMBEeW1-e4oerqxMg" role="_3_HiEQMBEeW1-e4oerqxMg"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_3_HiIwMBEeW1-e4oerqxMg" role="_3_HiEgMBEeW1-e4oerqxMg"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_3_HiJAMBEeW1-e4oerqxMg">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_3_HiJQMBEeW1-e4oerqxMg" role="_3_HiGAMBEeW1-e4oerqxMg"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_3_HiJgMBEeW1-e4oerqxMg" role="_3_HiGwMBEeW1-e4oerqxMg"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_3_HiJwMBEeW1-e4oerqxMg">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_3_HiKAMBEeW1-e4oerqxMg" role="_3_HiGwMBEeW1-e4oerqxMg"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_3_HiKQMBEeW1-e4oerqxMg" role="_3_HiHgMBEeW1-e4oerqxMg"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_3_HiKgMBEeW1-e4oerqxMg">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_3_HiKwMBEeW1-e4oerqxMg" role="_3_HiGwMBEeW1-e4oerqxMg"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_3_HiLAMBEeW1-e4oerqxMg" role="_3_HiFQMBEeW1-e4oerqxMg"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_F0uO4AMhEeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_F0wEEAMhEeWWbMjTqzYc1A" role="_tGurIAMgEeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_F0wEEQMhEeWWbMjTqzYc1A" role="_z2B0sAMgEeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_Ga2awAMhEeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_Ga3B0AMhEeWWbMjTqzYc1A" role="_z2B0sAMgEeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_Ga3o4AMhEeWWbMjTqzYc1A" role="_xDKrgAMgEeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_gSgf0AMiEeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_gShG4AMiEeWWbMjTqzYc1A" role="_3_HiEgMBEeW1-e4oerqxMg"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_gShG4QMiEeWWbMjTqzYc1A" role="_tGurIAMgEeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_KpMI0AM0EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_KpMv4AM0EeWWbMjTqzYc1A" role="_3_HiEgMBEeW1-e4oerqxMg"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_KpMv4QM0EeWWbMjTqzYc1A" role="_3_HiHgMBEeW1-e4oerqxMg"/>
+ </ownedConnector>
+ <ownedBehavior xmi:type="uml:Interaction" xmi:id="_3_HiLQMBEeW1-e4oerqxMg" name="Override Diagram Synchronization">
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_3_HiLgMBEeW1-e4oerqxMg" name="emfListener" represents="_3_HiEQMBEeW1-e4oerqxMg" coveredBy="_3_HiNAMBEeW1-e4oerqxMg _3_HiPwMBEeW1-e4oerqxMg"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_3_HiLwMBEeW1-e4oerqxMg" name="emfDispatch" represents="_3_HiEgMBEeW1-e4oerqxMg" coveredBy="_3_HiNQMBEeW1-e4oerqxMg _3_HiNgMBEeW1-e4oerqxMg _3_HiPgMBEeW1-e4oerqxMg _-QdHAQMyEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_3_HiMAMBEeW1-e4oerqxMg" name="syncRegistry" represents="_3_HiGAMBEeW1-e4oerqxMg" coveredBy="_3_HiPQMBEeW1-e4oerqxMg _0mPEcAMyEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_3_HiMQMBEeW1-e4oerqxMg" name="syncBucket" represents="_3_HiGwMBEeW1-e4oerqxMg" coveredBy="_3_HiOQMBEeW1-e4oerqxMg _3_HiOgMBEeW1-e4oerqxMg _3_HiPAMBEeW1-e4oerqxMg _2FzXkAMjEeWWbMjTqzYc1A _OcNZYQMyEeWWbMjTqzYc1A _nRZvIAMjEeWWbMjTqzYc1A _dk520AMyEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_3_HiMgMBEeW1-e4oerqxMg" name="syncFeature" represents="_3_HiHgMBEeW1-e4oerqxMg" coveredBy="_3_HiNwMBEeW1-e4oerqxMg _3_HiOAMBEeW1-e4oerqxMg _2FzXkQMjEeWWbMjTqzYc1A _OcNZYAMyEeWWbMjTqzYc1A _-QdHAAMyEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_3_HiMwMBEeW1-e4oerqxMg" name="syncItem" represents="_3_HiFQMBEeW1-e4oerqxMg" coveredBy="_3_HiOwMBEeW1-e4oerqxMg _dk6d4AMyEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_xgDJ4AMiEeWWbMjTqzYc1A" name="syncPolicy" represents="_tGurIAMgEeWWbMjTqzYc1A" coveredBy="_O3wqwAMjEeWWbMjTqzYc1A _V1bAcAMjEeWWbMjTqzYc1A _lCoxgAMjEeWWbMjTqzYc1A _nRZvIQMjEeWWbMjTqzYc1A _0mPrgAMyEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_1F52QAMiEeWWbMjTqzYc1A" name="delegateRegistry" represents="_z2B0sAMgEeWWbMjTqzYc1A" coveredBy="_O3x44AMjEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_6TzegAMiEeWWbMjTqzYc1A" name="policyDelegate" represents="_xDKrgAMgEeWWbMjTqzYc1A" coveredBy="_V1bAcQMjEeWWbMjTqzYc1A _lCpYkAMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiNAMBEeW1-e4oerqxMg" name="Message0Send0" covered="_3_HiLgMBEeW1-e4oerqxMg" message="_3_HiQAMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiNQMBEeW1-e4oerqxMg" name="Message0Recv0" covered="_3_HiLwMBEeW1-e4oerqxMg" message="_3_HiQAMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiNgMBEeW1-e4oerqxMg" name="Message0Send1" covered="_3_HiLwMBEeW1-e4oerqxMg" message="_3_HiQQMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiNwMBEeW1-e4oerqxMg" name="Message0Recv1" covered="_3_HiMgMBEeW1-e4oerqxMg" message="_3_HiQQMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiOAMBEeW1-e4oerqxMg" name="Message0Send2" covered="_3_HiMgMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiOQMBEeW1-e4oerqxMg" name="Message0Recv2" covered="_3_HiMQMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiOgMBEeW1-e4oerqxMg" name="Message0Send3" covered="_3_HiMQMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiOwMBEeW1-e4oerqxMg" name="Message0Recv3" covered="_3_HiMwMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiPAMBEeW1-e4oerqxMg" name="Message0Send4" covered="_3_HiMQMBEeW1-e4oerqxMg" message="_3_HiRAMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiPQMBEeW1-e4oerqxMg" name="Message0Recv4" covered="_3_HiMAMBEeW1-e4oerqxMg" message="_3_HiRAMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiPgMBEeW1-e4oerqxMg" name="Message0Send5" covered="_3_HiLwMBEeW1-e4oerqxMg" message="_3_HiRQMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_3_HiPwMBEeW1-e4oerqxMg" name="Message0Recv5" covered="_3_HiLgMBEeW1-e4oerqxMg" message="_3_HiRQMBEeW1-e4oerqxMg"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_O3wqwAMjEeWWbMjTqzYc1A" name="Message0Send6" covered="_xgDJ4AMiEeWWbMjTqzYc1A" message="_O3dIwAMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_O3x44AMjEeWWbMjTqzYc1A" name="Message0Recv6" covered="_1F52QAMiEeWWbMjTqzYc1A" message="_O3dIwAMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_V1bAcAMjEeWWbMjTqzYc1A" name="Message0Send7" covered="_xgDJ4AMiEeWWbMjTqzYc1A" message="_V1OMIAMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_V1bAcQMjEeWWbMjTqzYc1A" name="Message0Recv7" covered="_6TzegAMiEeWWbMjTqzYc1A" message="_V1OMIAMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_lCoxgAMjEeWWbMjTqzYc1A" name="Message0Send8" covered="_xgDJ4AMiEeWWbMjTqzYc1A" message="_lCUBYAMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_lCpYkAMjEeWWbMjTqzYc1A" name="Message0Recv8" covered="_6TzegAMiEeWWbMjTqzYc1A" message="_lCUBYAMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nRZvIAMjEeWWbMjTqzYc1A" name="Message0Send9" covered="_3_HiMQMBEeW1-e4oerqxMg" message="_nROI8AMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nRZvIQMjEeWWbMjTqzYc1A" name="Message0Recv9" covered="_xgDJ4AMiEeWWbMjTqzYc1A" message="_nROI8AMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_2FzXkAMjEeWWbMjTqzYc1A" name="Message0Send10" covered="_3_HiMQMBEeW1-e4oerqxMg" message="_2FoYcAMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_2FzXkQMjEeWWbMjTqzYc1A" name="Message0Recv10" covered="_3_HiMgMBEeW1-e4oerqxMg" message="_2FoYcAMjEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_OcNZYAMyEeWWbMjTqzYc1A" name="Message0Send101" covered="_3_HiMgMBEeW1-e4oerqxMg" message="_OcDBUAMyEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_OcNZYQMyEeWWbMjTqzYc1A" name="Message0Recv101" covered="_3_HiMQMBEeW1-e4oerqxMg" message="_OcDBUAMyEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_dk520AMyEeWWbMjTqzYc1A" name="Message0Send1011" covered="_3_HiMQMBEeW1-e4oerqxMg" message="_dkuQoAMyEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_dk6d4AMyEeWWbMjTqzYc1A" name="Message0Recv1011" covered="_3_HiMwMBEeW1-e4oerqxMg" message="_dkuQoAMyEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_0mPEcAMyEeWWbMjTqzYc1A" name="Message0Send10111" covered="_3_HiMAMBEeW1-e4oerqxMg" message="_0mEsYAMyEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_0mPrgAMyEeWWbMjTqzYc1A" name="Message0Recv10111" covered="_xgDJ4AMiEeWWbMjTqzYc1A" message="_0mEsYAMyEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_-QdHAAMyEeWWbMjTqzYc1A" name="Message0Send101111" covered="_3_HiMgMBEeW1-e4oerqxMg" message="_-QSH4AMyEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_-QdHAQMyEeWWbMjTqzYc1A" name="Message0Recv101111" covered="_3_HiLwMBEeW1-e4oerqxMg" message="_-QSH4AMyEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_3_HiQAMBEeW1-e4oerqxMg" name="7:notifications" receiveEvent="_3_HiNQMBEeW1-e4oerqxMg" sendEvent="_3_HiNAMBEeW1-e4oerqxMg"/>
+ <message xmi:type="uml:Message" xmi:id="_3_HiQQMBEeW1-e4oerqxMg" name="8:synchronize" receiveEvent="_3_HiNwMBEeW1-e4oerqxMg" sendEvent="_3_HiNgMBEeW1-e4oerqxMg"/>
+ <message xmi:type="uml:Message" xmi:id="_3_HiRAMBEeW1-e4oerqxMg" name="4:register" receiveEvent="_3_HiPQMBEeW1-e4oerqxMg" sendEvent="_3_HiPAMBEeW1-e4oerqxMg"/>
+ <message xmi:type="uml:Message" xmi:id="_3_HiRQMBEeW1-e4oerqxMg" name="3:add" receiveEvent="_3_HiPwMBEeW1-e4oerqxMg" sendEvent="_3_HiPgMBEeW1-e4oerqxMg"/>
+ <message xmi:type="uml:Message" xmi:id="_O3dIwAMjEeWWbMjTqzYc1A" name="11:getDelegate" receiveEvent="_O3x44AMjEeWWbMjTqzYc1A" sendEvent="_O3wqwAMjEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_V1OMIAMjEeWWbMjTqzYc1A" name="6:observe" receiveEvent="_V1bAcQMjEeWWbMjTqzYc1A" sendEvent="_V1bAcAMjEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_lCUBYAMjEeWWbMjTqzYc1A" name="12:shouldSynchronize" receiveEvent="_lCpYkAMjEeWWbMjTqzYc1A" sendEvent="_lCoxgAMjEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_nROI8AMjEeWWbMjTqzYc1A" name="10:shouldSynchronize" receiveEvent="_nRZvIQMjEeWWbMjTqzYc1A" sendEvent="_nRZvIAMjEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_2FoYcAMjEeWWbMjTqzYc1A" name="1:add" receiveEvent="_2FzXkQMjEeWWbMjTqzYc1A" sendEvent="_2FzXkAMjEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_OcDBUAMyEeWWbMjTqzYc1A" name="9:propagate" receiveEvent="_OcNZYQMyEeWWbMjTqzYc1A" sendEvent="_OcNZYAMyEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_dkuQoAMyEeWWbMjTqzYc1A" name="13:synchronize" receiveEvent="_dk6d4AMyEeWWbMjTqzYc1A" sendEvent="_dk520AMyEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_0mEsYAMyEeWWbMjTqzYc1A" name="5:register" receiveEvent="_0mPrgAMyEeWWbMjTqzYc1A" sendEvent="_0mPEcAMyEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_-QSH4AMyEeWWbMjTqzYc1A" name="2:create" receiveEvent="_-QdHAQMyEeWWbMjTqzYc1A" sendEvent="_-QdHAAMyEeWWbMjTqzYc1A"/>
+ </ownedBehavior>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Package" xmi:id="_hKj4QACoEeWnE_cMzyyIKA" name="org.eclipse.papyrus.infra.gmfdiag.common.sync">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_BVQPYACvEeWnE_cMzyyIKA" annotatedElement="_hKj4QACoEeWnE_cMzyyIKA">
+ <body>Implementation of reusable synchronization primitives for GMF-based diagrams.</body>
+ </ownedComment>
+ <packagedElement xmi:type="uml:Class" xmi:id="_rud44ADJEeWt3cohpcF8rA" name="ContainerChildrenSyncFeature">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_iLc_oADLEeWt3cohpcF8rA" annotatedElement="_rud44ADJEeWt3cohpcF8rA">
+ <body>A specialized SyncFeature that manages synchronization of child
+node EditParts for children of the front-end model element.</body>
+ </ownedComment>
+ <generalization xmi:type="uml:Generalization" xmi:id="_K2ZaMADKEeWt3cohpcF8rA" general="_sVtGwADDEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_2t6pAADJEeWt3cohpcF8rA" name="DiagramEdgesSyncFeature">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_oP8RoADLEeWt3cohpcF8rA" annotatedElement="_2t6pAADJEeWt3cohpcF8rA">
+ <body>A specialized SyncFeature that manages synchronization of source
+and target connection EditParts for relationships of the front-end
+model element.</body>
+ </ownedComment>
+ <generalization xmi:type="uml:Generalization" xmi:id="_LROVAADKEeWt3cohpcF8rA" general="_sVtGwADDEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_7_dbIADJEeWt3cohpcF8rA" name="NodePositionSyncFeature">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_sCf9QADLEeWt3cohpcF8rA" annotatedElement="_7_dbIADJEeWt3cohpcF8rA">
+ <body>A specialized SyncFeature that manages synchronization of the location
+in the diagram of a node EditPart.</body>
+ </ownedComment>
+ <generalization xmi:type="uml:Generalization" xmi:id="_LrTB4ADKEeWt3cohpcF8rA" general="_sVtGwADDEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_9S6nEADJEeWt3cohpcF8rA" name="NodeSizeSyncFeature">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_uMuZIADLEeWt3cohpcF8rA" annotatedElement="_9S6nEADJEeWt3cohpcF8rA">
+ <body>A specialized SyncFeature that manages synchronization of the size
+of a node EditPart.</body>
+ </ownedComment>
+ <generalization xmi:type="uml:Generalization" xmi:id="_MEdIwADKEeWt3cohpcF8rA" general="_sVtGwADDEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_aB0bgADKEeWt3cohpcF8rA" name="EditPartSyncRegistry">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_v5cPEADKEeWt3cohpcF8rA" annotatedElement="_aB0bgADKEeWt3cohpcF8rA">
+ <body>A SyncRegistry that manages SyncBuckets for synchronization of diagram
+EditParts that visualize EObjects in GMF-based diagrams.</body>
+ </ownedComment>
+ <generalization xmi:type="uml:Generalization" xmi:id="_h0K9gADKEeWt3cohpcF8rA" general="_kHf5wADEEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_bPHVEADKEeWt3cohpcF8rA" name="EditPartSyncBucket">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_DbvKAADLEeWt3cohpcF8rA" annotatedElement="_bPHVEADKEeWt3cohpcF8rA">
+ <body>A SyncBucket that manages the synchronization of diagram
+EditParts that visualize EObjects in GMF-based diagrams.
+By default, these buckets match edit-parts that all visualize
+the same model element in different diagrams, but this is
+customizable. For example, in the UML-RT case edit-parts
+are matched not with edit-parts visualizing the same model
+element but with edit-parts visualizing the redefined model
+element.</body>
+ </ownedComment>
+ <generalization xmi:type="uml:Generalization" xmi:id="_hYnp8ADKEeWt3cohpcF8rA" general="_jJG-4ADEEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_ccAmAADKEeWt3cohpcF8rA" name="EditPartSyncItem">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_JpGrMADLEeWt3cohpcF8rA" annotatedElement="_ccAmAADKEeWt3cohpcF8rA">
+ <body>A SyncItem that manages synchronization of an EditPart
+that visualizes an EObjects in a GMF-based diagram.</body>
+ </ownedComment>
+ <generalization xmi:type="uml:Generalization" xmi:id="_g5kWcADKEeWt3cohpcF8rA" general="_jW6KUADEEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Collaboration" xmi:id="_nvdy4AMdEeWWbMjTqzYc1A" name="Notation Synchronization">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_nvdy4QMdEeWWbMjTqzYc1A" name="emfListener" type="_HH6TEADGEeWt3cohpcF8rA"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_nvdy4gMdEeWWbMjTqzYc1A" name="positionDispatch" type="_omByAAMeEeWWbMjTqzYc1A">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_nvdy4wMdEeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_nvdy5AMdEeWWbMjTqzYc1A" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_nvdy5QMdEeWWbMjTqzYc1A" name="syncItem" type="_ccAmAADKEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_nvdy5gMdEeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_nvdy5wMdEeWWbMjTqzYc1A" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_nvdy6AMdEeWWbMjTqzYc1A" name="syncRegistry" type="_aB0bgADKEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_nvdy6QMdEeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_nvdy6gMdEeWWbMjTqzYc1A" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_nvdy6wMdEeWWbMjTqzYc1A" name="syncBucket" type="_bPHVEADKEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_nvdy7AMdEeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_nvdy7QMdEeWWbMjTqzYc1A" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_nvdy7gMdEeWWbMjTqzYc1A" name="positionFeature" type="_7_dbIADJEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_nvdy7wMdEeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_nvdy8AMdEeWWbMjTqzYc1A" value="1"/>
+ </ownedAttribute>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_nvdy8QMdEeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_nvdy8gMdEeWWbMjTqzYc1A" role="_nvdy4QMdEeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_nvdy8wMdEeWWbMjTqzYc1A" role="_nvdy4gMdEeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_nvdy9AMdEeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_nvdy9QMdEeWWbMjTqzYc1A" role="_nvdy6AMdEeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_nvdy9gMdEeWWbMjTqzYc1A" role="_nvdy6wMdEeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_nvdy9wMdEeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_nvdy-AMdEeWWbMjTqzYc1A" role="_nvdy6wMdEeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_nvdy-QMdEeWWbMjTqzYc1A" role="_nvdy7gMdEeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_nvdy-gMdEeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_nvdy-wMdEeWWbMjTqzYc1A" role="_nvdy6wMdEeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_nvdy_AMdEeWWbMjTqzYc1A" role="_nvdy5QMdEeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_Qlw08AM0EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_QlxcAAM0EeWWbMjTqzYc1A" role="_nvdy4gMdEeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_QlxcAQM0EeWWbMjTqzYc1A" role="_nvdy7gMdEeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedBehavior xmi:type="uml:Interaction" xmi:id="_nvdy_QMdEeWWbMjTqzYc1A" name="Synchronize Notation Views">
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_nvdy_gMdEeWWbMjTqzYc1A" name="emfListener" represents="_nvdy4QMdEeWWbMjTqzYc1A" coveredBy="_nvdzBAMdEeWWbMjTqzYc1A _nvdzDwMdEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_nvdy_wMdEeWWbMjTqzYc1A" name="emfDispatch" represents="_nvdy4gMdEeWWbMjTqzYc1A" coveredBy="_nvdzBQMdEeWWbMjTqzYc1A _nvdzBgMdEeWWbMjTqzYc1A _nvdzDgMdEeWWbMjTqzYc1A _VkMDUAMfEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_nvdzAAMdEeWWbMjTqzYc1A" name="syncRegistry" represents="_nvdy6AMdEeWWbMjTqzYc1A" coveredBy="_nvdzDQMdEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_nvdzAQMdEeWWbMjTqzYc1A" name="syncBucket" represents="_nvdy6wMdEeWWbMjTqzYc1A" coveredBy="_nvdzCQMdEeWWbMjTqzYc1A _nvdzCgMdEeWWbMjTqzYc1A _nvdzDAMdEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_nvdzAgMdEeWWbMjTqzYc1A" name="positionFeature" represents="_nvdy7gMdEeWWbMjTqzYc1A" coveredBy="_nvdzBwMdEeWWbMjTqzYc1A _nvdzCAMdEeWWbMjTqzYc1A _VkMDUQMfEeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_nvdzAwMdEeWWbMjTqzYc1A" name="syncItem" represents="_nvdy5QMdEeWWbMjTqzYc1A" coveredBy="_nvdzCwMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzBAMdEeWWbMjTqzYc1A" name="Message0Send0" covered="_nvdy_gMdEeWWbMjTqzYc1A" message="_nvdzEAMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzBQMdEeWWbMjTqzYc1A" name="Message0Recv0" covered="_nvdy_wMdEeWWbMjTqzYc1A" message="_nvdzEAMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzBgMdEeWWbMjTqzYc1A" name="Message0Send1" covered="_nvdy_wMdEeWWbMjTqzYc1A" message="_nvdzEQMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzBwMdEeWWbMjTqzYc1A" name="Message0Recv1" covered="_nvdzAgMdEeWWbMjTqzYc1A" message="_nvdzEQMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzCAMdEeWWbMjTqzYc1A" name="Message0Send2" covered="_nvdzAgMdEeWWbMjTqzYc1A" message="_nvdzEgMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzCQMdEeWWbMjTqzYc1A" name="Message0Recv2" covered="_nvdzAQMdEeWWbMjTqzYc1A" message="_nvdzEgMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzCgMdEeWWbMjTqzYc1A" name="Message0Send3" covered="_nvdzAQMdEeWWbMjTqzYc1A" message="_nvdzEwMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzCwMdEeWWbMjTqzYc1A" name="Message0Recv3" covered="_nvdzAwMdEeWWbMjTqzYc1A" message="_nvdzEwMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzDAMdEeWWbMjTqzYc1A" name="Message0Send4" covered="_nvdzAQMdEeWWbMjTqzYc1A" message="_nvdzFAMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzDQMdEeWWbMjTqzYc1A" name="Message0Recv4" covered="_nvdzAAMdEeWWbMjTqzYc1A" message="_nvdzFAMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzDgMdEeWWbMjTqzYc1A" name="Message0Send5" covered="_nvdy_wMdEeWWbMjTqzYc1A" message="_nvdzFQMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_nvdzDwMdEeWWbMjTqzYc1A" name="Message0Recv5" covered="_nvdy_gMdEeWWbMjTqzYc1A" message="_nvdzFQMdEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_VkMDUAMfEeWWbMjTqzYc1A" name="Message0Send6" covered="_nvdy_wMdEeWWbMjTqzYc1A" message="_VjrF8AMfEeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_VkMDUQMfEeWWbMjTqzYc1A" name="Message0Recv6" covered="_nvdzAgMdEeWWbMjTqzYc1A" message="_VjrF8AMfEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_nvdzEAMdEeWWbMjTqzYc1A" name="4:notifications" receiveEvent="_nvdzBQMdEeWWbMjTqzYc1A" sendEvent="_nvdzBAMdEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_nvdzEQMdEeWWbMjTqzYc1A" name="5:synchronize" receiveEvent="_nvdzBwMdEeWWbMjTqzYc1A" sendEvent="_nvdzBgMdEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_nvdzEgMdEeWWbMjTqzYc1A" name="6:propagate" receiveEvent="_nvdzCQMdEeWWbMjTqzYc1A" sendEvent="_nvdzCAMdEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_nvdzEwMdEeWWbMjTqzYc1A" name="7:synchronize" receiveEvent="_nvdzCwMdEeWWbMjTqzYc1A" sendEvent="_nvdzCgMdEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_nvdzFAMdEeWWbMjTqzYc1A" name="1:register" receiveEvent="_nvdzDQMdEeWWbMjTqzYc1A" sendEvent="_nvdzDAMdEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_nvdzFQMdEeWWbMjTqzYc1A" name="3:add" receiveEvent="_nvdzDwMdEeWWbMjTqzYc1A" sendEvent="_nvdzDgMdEeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_VjrF8AMfEeWWbMjTqzYc1A" name="2:getNotifier" receiveEvent="_VkMDUQMfEeWWbMjTqzYc1A" sendEvent="_VkMDUAMfEeWWbMjTqzYc1A"/>
+ </ownedBehavior>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_omByAAMeEeWWbMjTqzYc1A" name="NodePositionSyncDispatcher">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_5AgAYAMeEeWWbMjTqzYc1A" annotatedElement="_omByAAMeEeWWbMjTqzYc1A">
+ <body>A specialized dispatcher that listens to changes in the bounds of the notation view (Node)
+managed by an EditPart. It tracks the bounds of the shape, firing synchronization only
+when node's position actually changes from the last known position.</body>
+ </ownedComment>
+ <generalization xmi:type="uml:Generalization" xmi:id="_JXKFwAMfEeWWbMjTqzYc1A" general="_IShFAADGEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="__ruiQAMeEeWWbMjTqzYc1A" name="NodeSizeSyncDispatcher">
+ <ownedComment xmi:type="uml:Comment" xmi:id="__ruiQQMeEeWWbMjTqzYc1A" annotatedElement="__ruiQAMeEeWWbMjTqzYc1A">
+ <body>A specialized dispatcher that listens to changes in the bounds of the notation view (Node)
+managed by an EditPart. It tracks the bounds of the shape, firing synchronization only
+when node's size actually changes from the last known position.</body>
+ </ownedComment>
+ <generalization xmi:type="uml:Generalization" xmi:id="_Jzjt4AMfEeWWbMjTqzYc1A" general="_IShFAADGEeWt3cohpcF8rA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Collaboration" xmi:id="_XpZaUAM1EeWWbMjTqzYc1A" name="Synchronization Exclusions">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XpZaUQM1EeWWbMjTqzYc1A" name="emfListener" type="_HH6TEADGEeWt3cohpcF8rA"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XpZaUgM1EeWWbMjTqzYc1A" name="emfDispatch" type="_omByAAMeEeWWbMjTqzYc1A">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_XpZaUwM1EeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_XpZaVAM1EeWWbMjTqzYc1A" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XpZaVQM1EeWWbMjTqzYc1A" name="syncItem" type="_ccAmAADKEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_XpZaVgM1EeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_XpZaVwM1EeWWbMjTqzYc1A" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XpZaWAM1EeWWbMjTqzYc1A" name="syncRegistry" type="_aB0bgADKEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_XpZaWQM1EeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_XpZaWgM1EeWWbMjTqzYc1A" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XpZaWwM1EeWWbMjTqzYc1A" name="syncBucket" type="_bPHVEADKEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_XpZaXAM1EeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_XpZaXQM1EeWWbMjTqzYc1A" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XpZaXgM1EeWWbMjTqzYc1A" name="syncFeature" type="_7_dbIADJEeWt3cohpcF8rA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_XpZaXwM1EeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_XpZaYAM1EeWWbMjTqzYc1A" value="1"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XpZaYQM1EeWWbMjTqzYc1A" name="syncPolicy" type="_3hd78ADAEeWt3cohpcF8rA"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XpZaYgM1EeWWbMjTqzYc1A" name="syncPolicyDelegate" type="_ANAy8AM2EeWWbMjTqzYc1A">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_XpZaYwM1EeWWbMjTqzYc1A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_XpZaZAM1EeWWbMjTqzYc1A" value="1"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XpZaZQM1EeWWbMjTqzYc1A" name="delegateRegistry" type="_603mYADAEeWt3cohpcF8rA"/>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_XpZaZgM1EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZaZwM1EeWWbMjTqzYc1A" role="_XpZaUQM1EeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZaaAM1EeWWbMjTqzYc1A" role="_XpZaUgM1EeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_XpZaaQM1EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZaagM1EeWWbMjTqzYc1A" role="_XpZaWAM1EeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZaawM1EeWWbMjTqzYc1A" role="_XpZaWwM1EeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_XpZabAM1EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZabQM1EeWWbMjTqzYc1A" role="_XpZaWwM1EeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZabgM1EeWWbMjTqzYc1A" role="_XpZaXgM1EeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_XpZabwM1EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZacAM1EeWWbMjTqzYc1A" role="_XpZaWwM1EeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZacQM1EeWWbMjTqzYc1A" role="_XpZaVQM1EeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_XpZacgM1EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZacwM1EeWWbMjTqzYc1A" role="_XpZaYQM1EeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZadAM1EeWWbMjTqzYc1A" role="_XpZaZQM1EeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_XpZadQM1EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZadgM1EeWWbMjTqzYc1A" role="_XpZaZQM1EeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZadwM1EeWWbMjTqzYc1A" role="_XpZaYgM1EeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_XpZaeAM1EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZaeQM1EeWWbMjTqzYc1A" role="_XpZaUgM1EeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZaegM1EeWWbMjTqzYc1A" role="_XpZaYQM1EeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedConnector xmi:type="uml:Connector" xmi:id="_XpZaewM1EeWWbMjTqzYc1A">
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZafAM1EeWWbMjTqzYc1A" role="_XpZaUgM1EeWWbMjTqzYc1A"/>
+ <end xmi:type="uml:ConnectorEnd" xmi:id="_XpZafQM1EeWWbMjTqzYc1A" role="_XpZaYgM1EeWWbMjTqzYc1A"/>
+ </ownedConnector>
+ <ownedBehavior xmi:type="uml:Interaction" xmi:id="_XpZafgM1EeWWbMjTqzYc1A" name="Exclude Views from Synchronization">
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_XpZafwM1EeWWbMjTqzYc1A" name="emfListener" represents="_XpZaUQM1EeWWbMjTqzYc1A" coveredBy="_XpZaiAM1EeWWbMjTqzYc1A _XpZakwM1EeWWbMjTqzYc1A _BcRl8AM3EeWWbMjTqzYc1A _EG1HsAM3EeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_XpZagAM1EeWWbMjTqzYc1A" name="emfDispatch" represents="_XpZaUgM1EeWWbMjTqzYc1A" coveredBy="_XpZaiQM1EeWWbMjTqzYc1A _XpZaigM1EeWWbMjTqzYc1A _XpZakgM1EeWWbMjTqzYc1A _XpZapQM1EeWWbMjTqzYc1A __dqkMQM2EeWWbMjTqzYc1A _BcQ-4AM3EeWWbMjTqzYc1A _EG1uwAM3EeWWbMjTqzYc1A _IH_3EAM3EeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_XpZagQM1EeWWbMjTqzYc1A" name="syncRegistry" represents="_XpZaWAM1EeWWbMjTqzYc1A" coveredBy="_XpZakQM1EeWWbMjTqzYc1A _XpZaogM1EeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_XpZahQM1EeWWbMjTqzYc1A" name="syncPolicy" represents="_XpZaYQM1EeWWbMjTqzYc1A" coveredBy="_XpZalAM1EeWWbMjTqzYc1A _XpZalgM1EeWWbMjTqzYc1A _XpZamAM1EeWWbMjTqzYc1A _XpZamwM1EeWWbMjTqzYc1A _XpZaowM1EeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_XpZahgM1EeWWbMjTqzYc1A" name="delegateRegistry" represents="_XpZaZQM1EeWWbMjTqzYc1A" coveredBy="_XpZalQM1EeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_XpZahwM1EeWWbMjTqzYc1A" name="policyDelegate" represents="_XpZaYgM1EeWWbMjTqzYc1A" coveredBy="_XpZalwM1EeWWbMjTqzYc1A _XpZamQM1EeWWbMjTqzYc1A __dqkMAM2EeWWbMjTqzYc1A _IIAeIAM3EeWWbMjTqzYc1A _Q77x4AM3EeWWbMjTqzYc1A"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_MHImIAM3EeWWbMjTqzYc1A" name="editPartSyncItem" represents="_XpZaVQM1EeWWbMjTqzYc1A" coveredBy="_Q78Y8AM3EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZaiAM1EeWWbMjTqzYc1A" name="Message0Send0" covered="_XpZafwM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZaiQM1EeWWbMjTqzYc1A" name="Message0Recv0" covered="_XpZagAM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZaigM1EeWWbMjTqzYc1A" name="Message0Send1" covered="_XpZagAM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZaiwM1EeWWbMjTqzYc1A" name="Message0Recv1"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZajAM1EeWWbMjTqzYc1A" name="Message0Send2"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZajQM1EeWWbMjTqzYc1A" name="Message0Recv2"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZajgM1EeWWbMjTqzYc1A" name="Message0Send3"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZajwM1EeWWbMjTqzYc1A" name="Message0Recv3"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZakAM1EeWWbMjTqzYc1A" name="Message0Send4" message="_XpZaqAM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZakQM1EeWWbMjTqzYc1A" name="Message0Recv4" covered="_XpZagQM1EeWWbMjTqzYc1A" message="_XpZaqAM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZakgM1EeWWbMjTqzYc1A" name="Message0Send5" covered="_XpZagAM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZakwM1EeWWbMjTqzYc1A" name="Message0Recv5" covered="_XpZafwM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZalAM1EeWWbMjTqzYc1A" name="Message0Send6" covered="_XpZahQM1EeWWbMjTqzYc1A" message="_XpZaqgM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZalQM1EeWWbMjTqzYc1A" name="Message0Recv6" covered="_XpZahgM1EeWWbMjTqzYc1A" message="_XpZaqgM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZalgM1EeWWbMjTqzYc1A" name="Message0Send7" covered="_XpZahQM1EeWWbMjTqzYc1A" message="_XpZaqwM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZalwM1EeWWbMjTqzYc1A" name="Message0Recv7" covered="_XpZahwM1EeWWbMjTqzYc1A" message="_XpZaqwM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZamAM1EeWWbMjTqzYc1A" name="Message0Send8" covered="_XpZahQM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZamQM1EeWWbMjTqzYc1A" name="Message0Recv8" covered="_XpZahwM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZamgM1EeWWbMjTqzYc1A" name="Message0Send9" message="_XpZarQM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZamwM1EeWWbMjTqzYc1A" name="Message0Recv9" covered="_XpZahQM1EeWWbMjTqzYc1A" message="_XpZarQM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZanAM1EeWWbMjTqzYc1A" name="Message0Send10"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZanQM1EeWWbMjTqzYc1A" name="Message0Recv10"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZangM1EeWWbMjTqzYc1A" name="Message0Send101"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZanwM1EeWWbMjTqzYc1A" name="Message0Recv101"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZaoAM1EeWWbMjTqzYc1A" name="Message0Send1011"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZaoQM1EeWWbMjTqzYc1A" name="Message0Recv1011"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZaogM1EeWWbMjTqzYc1A" name="Message0Send10111" covered="_XpZagQM1EeWWbMjTqzYc1A" message="_XpZasQM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZaowM1EeWWbMjTqzYc1A" name="Message0Recv10111" covered="_XpZahQM1EeWWbMjTqzYc1A" message="_XpZasQM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZapAM1EeWWbMjTqzYc1A" name="Message0Send101111"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_XpZapQM1EeWWbMjTqzYc1A" name="Message0Recv101111" covered="_XpZagAM1EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="__dqkMAM2EeWWbMjTqzYc1A" name="Message0Send1011111" covered="_XpZahwM1EeWWbMjTqzYc1A" message="__dgzMAM2EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="__dqkMQM2EeWWbMjTqzYc1A" name="Message0Recv1011111" covered="_XpZagAM1EeWWbMjTqzYc1A" message="__dgzMAM2EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_BcQ-4AM3EeWWbMjTqzYc1A" name="Message0Send10111111" covered="_XpZagAM1EeWWbMjTqzYc1A" message="_BcHN4AM3EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_BcRl8AM3EeWWbMjTqzYc1A" name="Message0Recv10111111" covered="_XpZafwM1EeWWbMjTqzYc1A" message="_BcHN4AM3EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_EG1HsAM3EeWWbMjTqzYc1A" name="Message0Send101111111" covered="_XpZafwM1EeWWbMjTqzYc1A" message="_EGr9wAM3EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_EG1uwAM3EeWWbMjTqzYc1A" name="Message0Recv101111111" covered="_XpZagAM1EeWWbMjTqzYc1A" message="_EGr9wAM3EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_IH_3EAM3EeWWbMjTqzYc1A" name="Message0Send1011111111" covered="_XpZagAM1EeWWbMjTqzYc1A" message="_IH2GEAM3EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_IIAeIAM3EeWWbMjTqzYc1A" name="Message0Recv1011111111" covered="_XpZahwM1EeWWbMjTqzYc1A" message="_IH2GEAM3EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_Q77x4AM3EeWWbMjTqzYc1A" name="Message0Send10111111111" covered="_XpZahwM1EeWWbMjTqzYc1A" message="_Q7yA4AM3EeWWbMjTqzYc1A"/>
+ <fragment xmi:type="uml:MessageOccurrenceSpecification" xmi:id="_Q78Y8AM3EeWWbMjTqzYc1A" name="Message0Recv10111111111" covered="_MHImIAM3EeWWbMjTqzYc1A" message="_Q7yA4AM3EeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_XpZaqAM1EeWWbMjTqzYc1A" name="1:register" receiveEvent="_XpZakQM1EeWWbMjTqzYc1A" sendEvent="_XpZakAM1EeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_XpZaqgM1EeWWbMjTqzYc1A" name="3:register" receiveEvent="_XpZalQM1EeWWbMjTqzYc1A" sendEvent="_XpZalAM1EeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_XpZaqwM1EeWWbMjTqzYc1A" name="4:observe" receiveEvent="_XpZalwM1EeWWbMjTqzYc1A" sendEvent="_XpZalgM1EeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_XpZarQM1EeWWbMjTqzYc1A" name="10:shouldSynchronize" receiveEvent="_XpZamwM1EeWWbMjTqzYc1A" sendEvent="_XpZamgM1EeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_XpZasQM1EeWWbMjTqzYc1A" name="2:register" receiveEvent="_XpZaowM1EeWWbMjTqzYc1A" sendEvent="_XpZaogM1EeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="__dgzMAM2EeWWbMjTqzYc1A" name="5:create" receiveEvent="__dqkMQM2EeWWbMjTqzYc1A" sendEvent="__dqkMAM2EeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_BcHN4AM3EeWWbMjTqzYc1A" name="6:add" receiveEvent="_BcRl8AM3EeWWbMjTqzYc1A" sendEvent="_BcQ-4AM3EeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_EGr9wAM3EeWWbMjTqzYc1A" name="7:notifications" receiveEvent="_EG1uwAM3EeWWbMjTqzYc1A" sendEvent="_EG1HsAM3EeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_IH2GEAM3EeWWbMjTqzYc1A" name="8:overrideOccurred" receiveEvent="_IIAeIAM3EeWWbMjTqzYc1A" sendEvent="_IH_3EAM3EeWWbMjTqzYc1A"/>
+ <message xmi:type="uml:Message" xmi:id="_Q7yA4AM3EeWWbMjTqzYc1A" name="9:stopSynchronizing" receiveEvent="_Q78Y8AM3EeWWbMjTqzYc1A" sendEvent="_Q77x4AM3EeWWbMjTqzYc1A"/>
+ </ownedBehavior>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_ANAy8AM2EeWWbMjTqzYc1A" name="NotationSyncPolicyDelegate">
+ <generalization xmi:type="uml:Generalization" xmi:id="_CS6vgAM2EeWWbMjTqzYc1A" general="_v56UsADAEeWt3cohpcF8rA"/>
+ </packagedElement>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Model" xmi:id="_y3pEOACLEeWudc8agGQ04Q" name="Tests">
+ <packagedElement xmi:type="uml:Component" xmi:id="_bQLMYAM4EeWWbMjTqzYc1A" name="org.eclipse.papyrus.infra.gmfdiag.common.tests">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_5LGnsAM7EeWWbMjTqzYc1A" annotatedElement="_bQLMYAM4EeWWbMjTqzYc1A">
+ <body>Test bundle for the Papyrus common diagram core plug-in.</body>
+ </ownedComment>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Package" xmi:id="_qA5OsAM4EeWWbMjTqzYc1A" name="org.eclipse.papyrus.infra.gmfdiag.common.sync.tests">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_AvGkoAM8EeWWbMjTqzYc1A" annotatedElement="_qA5OsAM4EeWWbMjTqzYc1A">
+ <body>Test suite for the synchronization framework, covering both model-to-model
+and diagram-to-diagram synchronization use cases.</body>
+ </ownedComment>
+ <packagedElement xmi:type="uml:Class" xmi:id="_jt_QwAM5EeWWbMjTqzYc1A" name="MasterSlaveNotationSyncTest">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_ORw4YAM8EeWWbMjTqzYc1A" annotatedElement="_jt_QwAM5EeWWbMjTqzYc1A">
+ <body>Tests the synchronization framework basic synchronization use cases by way
+of master/slave diagram-to-diagram synchronization.</body>
+ </ownedComment>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_spIm0gM5EeWWbMjTqzYc1A" name="fixture" type="_nytqcAM5EeWWbMjTqzYc1A" association="_spH_wAM5EeWWbMjTqzYc1A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_lhLFoAM5EeWWbMjTqzYc1A" name="NotationSyncOverrideTest">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_R59HEAM8EeWWbMjTqzYc1A" annotatedElement="_lhLFoAM5EeWWbMjTqzYc1A">
+ <body>Tests the synchronization framework's support for synchronization overrides
+by way of master/slave diagram-to-diagram synchronization.</body>
+ </ownedComment>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sIWN8AM5EeWWbMjTqzYc1A" name="fixture" type="_nytqcAM5EeWWbMjTqzYc1A" association="_sIEhIAM5EeWWbMjTqzYc1A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_nytqcAM5EeWWbMjTqzYc1A" name="TestSyncFixture">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_ZYyQIAM8EeWWbMjTqzYc1A" annotatedElement="_nytqcAM5EeWWbMjTqzYc1A">
+ <body>A JUnit test-fixture rule that implements a synchronization registry for class
+diagrams in the context of the test execution.</body>
+ </ownedComment>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_sIEhIAM5EeWWbMjTqzYc1A" memberEnd="_sIWN8AM5EeWWbMjTqzYc1A _sIWN8QM5EeWWbMjTqzYc1A">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_sIMc8AM5EeWWbMjTqzYc1A" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_sIMc8QM5EeWWbMjTqzYc1A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_sIWN8QM5EeWWbMjTqzYc1A" type="_lhLFoAM5EeWWbMjTqzYc1A" association="_sIEhIAM5EeWWbMjTqzYc1A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_spH_wAM5EeWWbMjTqzYc1A" memberEnd="_spIm0gM5EeWWbMjTqzYc1A _spIm0wM5EeWWbMjTqzYc1A">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_spIm0AM5EeWWbMjTqzYc1A" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_spIm0QM5EeWWbMjTqzYc1A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_spIm0wM5EeWWbMjTqzYc1A" type="_jt_QwAM5EeWWbMjTqzYc1A" association="_spH_wAM5EeWWbMjTqzYc1A"/>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Realization" xmi:id="_xQPxUAM4EeWWbMjTqzYc1A" client="_qA5OsAM4EeWWbMjTqzYc1A" supplier="_bQLMYAM4EeWWbMjTqzYc1A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_y3pENACLEeWudc8agGQ04Q" name="illustrates" client="_y3pEMwCLEeWudc8agGQ04Q" supplier="_y3pEMgCLEeWudc8agGQ04Q"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_y3pENwCLEeWudc8agGQ04Q" name="realizes" client="_y3pENgCLEeWudc8agGQ04Q" supplier="_y3pEMwCLEeWudc8agGQ04Q"/>
+ <packagedElement xmi:type="uml:Dependency" xmi:id="_y3pEOQCLEeWudc8agGQ04Q" name="verifies" client="_y3pEOACLEeWudc8agGQ04Q" supplier="_y3pEMwCLEeWudc8agGQ04Q"/>
+ <packagedElement xmi:type="uml:Dependency" xmi:id="_y3pEOgCLEeWudc8agGQ04Q" name="tests" client="_y3pEOACLEeWudc8agGQ04Q" supplier="_y3pENgCLEeWudc8agGQ04Q"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_nKpIAALwEeW1-e4oerqxMg" client="_FNBpcALkEeWy2L7kEYTJVw" supplier="_H3xwAP_lEeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_LFAN0AMCEeW1-e4oerqxMg" client="_FNBpcALkEeWy2L7kEYTJVw" supplier="_BwcAgP_0EeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_6GeUgAMfEeWWbMjTqzYc1A" client="_nvdy4AMdEeWWbMjTqzYc1A" supplier="_e-QjYP_lEeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_JseZAAMgEeWWbMjTqzYc1A" client="_nvdy4AMdEeWWbMjTqzYc1A" supplier="_zJRGUP_0EeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_3uMpAAM0EeWWbMjTqzYc1A" client="_3_HiEAMBEeW1-e4oerqxMg" supplier="__JdhwP_0EeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_OLiYwAM1EeWWbMjTqzYc1A" client="_3_HiEAMBEeW1-e4oerqxMg" supplier="_NlpXIP_4EeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_etPloAM3EeWWbMjTqzYc1A" client="_XpZaUAM1EeWWbMjTqzYc1A" supplier="__JdhwP_0EeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_kY4SwAM3EeWWbMjTqzYc1A" client="_XpZaUAM1EeWWbMjTqzYc1A" supplier="_lWa_UP_lEeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_EtQuMAM6EeWWbMjTqzYc1A" client="_jt_QwAM5EeWWbMjTqzYc1A" supplier="_H3xwAP_lEeScYo8tuJyy0A _e-QjYP_lEeScYo8tuJyy0A _NlpXIP_4EeScYo8tuJyy0A"/>
+ <packagedElement xmi:type="uml:Abstraction" xmi:id="_4X_lMAM6EeWWbMjTqzYc1A" client="_lhLFoAM5EeWWbMjTqzYc1A" supplier="_lWa_UP_lEeScYo8tuJyy0A _e-QjYP_lEeScYo8tuJyy0A"/>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_y3pEOwCLEeWudc8agGQ04Q">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_y3pEPACLEeWudc8agGQ04Q" source="PapyrusVersion">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEPQCLEeWudc8agGQ04Q" key="Version" value="0.0.7"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEPgCLEeWudc8agGQ04Q" key="Comment" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEPwCLEeWudc8agGQ04Q" key="Copyright" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEQACLEeWudc8agGQ04Q" key="Date" value="2014-11-26"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEQQCLEeWudc8agGQ04Q" key="Author" value=""/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_y3pEQgCLEeWudc8agGQ04Q" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_rplkQXVxEeSZ-fQGFkyJeQ"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_kWqjAMbXEeO09JBvNFZRNw"/>
+ </profileApplication>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_y3pEQwCLEeWudc8agGQ04Q">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_y3pERACLEeWudc8agGQ04Q" source="PapyrusVersion">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pERQCLEeWudc8agGQ04Q" key="Version" value="0.0.7"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pERgCLEeWudc8agGQ04Q" key="Comment" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pERwCLEeWudc8agGQ04Q" key="Copyright" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pESACLEeWudc8agGQ04Q" key="Date" value="2014-11-26"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pESQCLEeWudc8agGQ04Q" key="Author" value=""/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_y3pESgCLEeWudc8agGQ04Q" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_rpmyYHVxEeSZ-fQGFkyJeQ"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_qCT3MMbXEeO09JBvNFZRNw"/>
+ </profileApplication>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_y3pESwCLEeWudc8agGQ04Q">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_y3pETACLEeWudc8agGQ04Q" source="PapyrusVersion">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pETQCLEeWudc8agGQ04Q" key="Version" value="0.0.7"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pETgCLEeWudc8agGQ04Q" key="Comment" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pETwCLEeWudc8agGQ04Q" key="Copyright" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEUACLEeWudc8agGQ04Q" key="Date" value="2014-11-26"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEUQCLEeWudc8agGQ04Q" key="Author" value=""/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_y3pEUgCLEeWudc8agGQ04Q" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_rpnZcXVxEeSZ-fQGFkyJeQ"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://DEVELOPER_PROFILES/developerprocess.profile.uml#_2LNtQMbYEeO09JBvNFZRNw"/>
+ </profileApplication>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_y3pEUwCLEeWudc8agGQ04Q">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_y3pEVACLEeWudc8agGQ04Q" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="http://www.eclipse.org/papyrus/0.7.0/SysML#//requirements"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://SysML_PROFILES/SysML.profile.uml#_OOJC4LX8EduFmqQsrNB9lw"/>
+ </profileApplication>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_y3pEVQCLEeWudc8agGQ04Q">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_y3pEVgCLEeWudc8agGQ04Q" source="PapyrusVersion">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEVwCLEeWudc8agGQ04Q" key="Version" value="0.0.11"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEWACLEeWudc8agGQ04Q" key="Comment" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEWQCLEeWudc8agGQ04Q" key="Copyright" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEWgCLEeWudc8agGQ04Q" key="Date" value="2014-11-14"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_y3pEWwCLEeWudc8agGQ04Q" key="Author" value=""/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_y3pEXACLEeWudc8agGQ04Q" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://DEVELOPER_PROFILES/Document.profile.uml#_RQrLoWwBEeSIYu1Ih2FYyQ"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://DEVELOPER_PROFILES/Document.profile.uml#_D0JcUMnzEeO9CYUoXDRplw"/>
+ </profileApplication>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_w2fvAACPEeWudc8agGQ04Q">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_w2gWEACPEeWudc8agGQ04Q" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="http://www.eclipse.org/uml2/5.0.0/UML/Profile/Standard#/"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://UML_PROFILES/Standard.profile.uml#_0"/>
+ </profileApplication>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_aR0Q4ALvEeW1-e4oerqxMg">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_aR1fAALvEeW1-e4oerqxMg" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://PAPYRUS_ACTIONLANGUAGE_PROFILE/ActionLanguage-Profile.profile.uml#_Kv8EIKFXEeS_KNX0nfvIVQ"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://PAPYRUS_ACTIONLANGUAGE_PROFILE/ActionLanguage-Profile.profile.uml#ActionLanguage"/>
+ </profileApplication>
+ </uml:Model>
+ <structure:Project xmi:id="_y3pEXQCLEeWudc8agGQ04Q" author="Christian W. Damus" version="1.1" base_Model="_y3pEMACLEeWudc8agGQ04Q" title="Generic Model Synchronization Framework"/>
+ <structure:Requirements xmi:id="_y3pEXgCLEeWudc8agGQ04Q" base_Model="_y3pEMgCLEeWudc8agGQ04Q"/>
+ <structure:UseCases xmi:id="_y3pEXwCLEeWudc8agGQ04Q" base_Model="_y3pEMwCLEeWudc8agGQ04Q"/>
+ <structure:Design xmi:id="_y3pEYACLEeWudc8agGQ04Q" base_Model="_y3pENgCLEeWudc8agGQ04Q"/>
+ <structure:Tests xmi:id="_y3pEYQCLEeWudc8agGQ04Q" base_Model="_y3pEOACLEeWudc8agGQ04Q"/>
+ <Requirements:Requirement xmi:id="_H33PkP_lEeScYo8tuJyy0A" text="The framework SHALL support the automatic synchronization of model semantics. For example, a state machine in a subclass that redefines a state machine in a superclass must always define regions, vertices, and transitions corresponding to and redefining the regions, vertices, and transitions of the superclass state machine." id="R1" base_Class="_H3xwAP_lEeScYo8tuJyy0A"/>
+ <Requirements:Requirement xmi:id="_e-RxgP_lEeScYo8tuJyy0A" text="The framework SHALL support automatic synchronization of the layout of diagrams. For example, a state machine diagram in a subclass that redefines a state machine in a superclass initially presents the same layout as the superclass state machine and changes in the superclass state machine diagram layout are reflected in the subclass." id="R2" base_Class="_e-QjYP_lEeScYo8tuJyy0A"/>
+ <Requirements:Requirement xmi:id="_lWbmYP_lEeScYo8tuJyy0A" text="Synchronization of diagram layout SHALL be optional. Initially, a diagram is synchronized with the diagram that it redefines, but as needed to effect a sensible layout of the redefining diagram, this synchronization may be broken by the user. The semantics remain synchronized, and some graphical views may remain synchronized, but the user may freely rearrange other views as required by the redefining context." id="R2.1" base_Class="_lWa_UP_lEeScYo8tuJyy0A"/>
+ <Requirements:Requirement xmi:id="_NlqlQP_4EeScYo8tuJyy0A" text="The framework SHALL support the creation of additional elements in the target of a model-to-model synchronization. For example, the state machine of a UML-RT Capsule may add vertices, transitions, and regions in addition to those that are synchronized from (and redefined) the vertices, transitions, and regions of the parent Capsule. Moreover, transitions that redefine transitions in the parent Capsule may be re-targeted to (or re-sourced from) vertices that are added by the redefining state machine." id="R1.1" base_Class="_NlpXIP_4EeScYo8tuJyy0A"/>
+ <standard:Refine xmi:id="_vaOv4ACQEeWudc8agGQ04Q" base_Abstraction="_obO-sP_mEeScYo8tuJyy0A"/>
+ <standard:Trace xmi:id="_zvkN4ACPEeWudc8agGQ04Q" base_Abstraction="_ZPkSgP_2EeScYo8tuJyy0A"/>
+ <standard:Trace xmi:id="_0ntW0ACPEeWudc8agGQ04Q" base_Abstraction="_PQN4AP_3EeScYo8tuJyy0A"/>
+ <standard:Trace xmi:id="_1crP8ACPEeWudc8agGQ04Q" base_Abstraction="_vHLCgP_3EeScYo8tuJyy0A"/>
+ <standard:Trace xmi:id="_2JZMAACPEeWudc8agGQ04Q" base_Abstraction="_1OBsAP_3EeScYo8tuJyy0A"/>
+ <standard:Trace xmi:id="_239iMACPEeWudc8agGQ04Q" base_Abstraction="_8iwBYP_4EeScYo8tuJyy0A"/>
+ <standard:Trace xmi:id="_3pwLgACPEeWudc8agGQ04Q" base_Abstraction="_-hv6IP_3EeScYo8tuJyy0A"/>
+ <standard:Refine xmi:id="_h2XFwACREeWudc8agGQ04Q" base_Abstraction="_h2TbYACREeWudc8agGQ04Q"/>
+ <Requirements:Satisfy xmi:id="_pdy2YALwEeW1-e4oerqxMg" base_Abstraction="_nKpIAALwEeW1-e4oerqxMg"/>
+ <standard:Trace xmi:id="_PzZ2oAMCEeW1-e4oerqxMg" base_Abstraction="_LFAN0AMCEeW1-e4oerqxMg"/>
+ <standard:Trace xmi:id="_MlxhYAMgEeWWbMjTqzYc1A" base_Abstraction="_JseZAAMgEeWWbMjTqzYc1A"/>
+ <Requirements:Satisfy xmi:id="_R-KiYAMgEeWWbMjTqzYc1A" base_Abstraction="_6GeUgAMfEeWWbMjTqzYc1A"/>
+ <standard:Trace xmi:id="_6RtuoAM0EeWWbMjTqzYc1A" base_Abstraction="_3uMpAAM0EeWWbMjTqzYc1A"/>
+ <Requirements:Satisfy xmi:id="_RtbLIAM1EeWWbMjTqzYc1A" base_Abstraction="_OLiYwAM1EeWWbMjTqzYc1A"/>
+ <standard:Trace xmi:id="_hhyJ0AM3EeWWbMjTqzYc1A" base_Abstraction="_etPloAM3EeWWbMjTqzYc1A"/>
+ <Requirements:Satisfy xmi:id="_la5wcAM3EeWWbMjTqzYc1A" base_Abstraction="_kY4SwAM3EeWWbMjTqzYc1A"/>
+ <Requirements:Verify xmi:id="_K9D4UAM6EeWWbMjTqzYc1A" base_Abstraction="_EtQuMAM6EeWWbMjTqzYc1A"/>
+ <Requirements:Verify xmi:id="_5zUTsAM6EeWWbMjTqzYc1A" base_Abstraction="_4X_lMAM6EeWWbMjTqzYc1A"/>
+</xmi:XMI>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Exclude_Views_from_Synchronization.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Exclude_Views_from_Synchronization.png
new file mode 100644
index 00000000000..80030133ecb
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Exclude_Views_from_Synchronization.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Notation_Sync_Classes.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Notation_Sync_Classes.png
new file mode 100644
index 00000000000..a558e2841c8
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Notation_Sync_Classes.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Notation_Synchronization.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Notation_Synchronization.png
new file mode 100644
index 00000000000..70e1576cc00
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Notation_Synchronization.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Plug-ins.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Plug-ins.png
new file mode 100644
index 00000000000..f0b376c2a85
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Plug-ins.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Framework_Core_Classes.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Framework_Core_Classes.png
new file mode 100644
index 00000000000..6c18db39cb2
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Framework_Core_Classes.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Policy_Classes.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Policy_Classes.png
new file mode 100644
index 00000000000..636c1cfd706
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Policy_Classes.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Service_Classes.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Service_Classes.png
new file mode 100644
index 00000000000..6a6c5d6b1d5
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Sync_Service_Classes.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization.png
new file mode 100644
index 00000000000..8a21d85bb58
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Exclusions.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Exclusions.png
new file mode 100644
index 00000000000..b9f09845954
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Exclusions.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Overrides.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Overrides.png
new file mode 100644
index 00000000000..7ab3fd2cef9
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Overrides.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Overrides_1.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Overrides_1.png
new file mode 100644
index 00000000000..4f6992aec2c
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronization_Overrides_1.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronize_Model_Elements.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronize_Model_Elements.png
new file mode 100644
index 00000000000..622f7b1366c
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronize_Model_Elements.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronize_Model_Elements_1.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronize_Model_Elements_1.png
new file mode 100644
index 00000000000..90e874d8234
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Synchronize_Model_Elements_1.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Test_Classes.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Test_Classes.png
new file mode 100644
index 00000000000..68f728225d4
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Test_Classes.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Test_Plug-ins.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Test_Plug-ins.png
new file mode 100644
index 00000000000..b3edbe62911
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Test_Plug-ins.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Use_Cases.png b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Use_Cases.png
new file mode 100644
index 00000000000..cf91d7830d1
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/doc/imgDOC/Use_Cases.png
Binary files differ
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/plugin.properties b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/plugin.properties
new file mode 100644
index 00000000000..76359109316
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/plugin.properties
@@ -0,0 +1,13 @@
+#
+# Copyright (c) 2015 Christian W. Damus 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:
+# Christian W. Damus - initial API and implementation
+#
+
+pluginName = Papyrus Synchronization API
+providerName = Eclipse Modeling Project
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/plugin.xml b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/plugin.xml
new file mode 100644
index 00000000000..28900bbab26
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+ Copyright (c) 2015 Christian W. Damus 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:
+ Christian W. Damus - Initial API and implementation
+
+-->
+<plugin>
+ <extension-point id="triggers" name="Synchronization Triggers" schema="schema/triggers.exsd"/>
+ <extension
+ point="org.eclipse.papyrus.infra.core.service">
+ <service
+ classname="org.eclipse.papyrus.infra.sync.internal.SyncService"
+ description="The general-purpose synchronization service"
+ id="org.eclipse.papyrus.infra.sync.service.ISyncService"
+ priority="10"
+ startKind="lazy">
+ <dependsOn
+ serviceKeyRef="org.eclipse.emf.transaction.TransactionalEditingDomain">
+ </dependsOn>
+ </service>
+ </extension>
+
+</plugin>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/pom.xml b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/pom.xml
new file mode 100644
index 00000000000..a909d6e47d0
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/pom.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>org.eclipse.papyrus.infra-misc</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+ <artifactId>org.eclipse.papyrus.infra.sync</artifactId>
+ <version>1.2.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/schema/triggers.exsd b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/schema/triggers.exsd
new file mode 100644
index 00000000000..3923e4c36b8
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/schema/triggers.exsd
@@ -0,0 +1,101 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.papyrus.infra.sync" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.papyrus.infra.sync" id="org.eclipse.papyrus.infra.sync.triggers" name="Synchronization Triggers"/>
+ </appinfo>
+ <documentation>
+ Registration of model synchronization triggers
+ </documentation>
+ </annotation>
+
+ <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="syncTrigger" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="syncTrigger">
+ <annotation>
+ <documentation>
+ Registration of a synchronization action to be performed on certain triggering objects (as determined by a matching condition, which may be implemented either with a nested &lt;tt&gt;&amp;lt;enablement&amp;gt;&lt;/tt&gt; expression or in code).
+ </documentation>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="enablement" minOccurs="0" maxOccurs="1"/>
+ </sequence>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ A class implementing the &lt;tt&gt;ISyncTrigger&lt;/tt&gt; interface. If an XML &lt;tt&gt;&amp;lt;enablement&amp;gt;&lt;/tt&gt; expression is supplied, it is recommended to extend the &lt;tt&gt;AbstractSyncTrigger&lt;/tt&gt; class.
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.papyrus.infra.sync.service.ISyncTrigger"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ Papyrus 1.1
+ </documentation>
+ </annotation>
+
+
+
+
+ <annotation>
+ <appinfo>
+ <meta.section type="copyright"/>
+ </appinfo>
+ <documentation>
+ Copyright (c) 2015 Christian W. Damus 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
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/Activator.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/Activator.java
new file mode 100755
index 00000000000..e0bb8d38ddd
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/Activator.java
@@ -0,0 +1,73 @@
+/*****************************************************************************
+ * Copyright (c) 2014, 2016 CEA LIST, Christian W. Damus, 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:
+ * Laurent Wouters laurent.wouters@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 485220
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.papyrus.infra.sync"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /** Logging helper */
+ public static LogHelper log;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ log = new LogHelper(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFDispatch.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFDispatch.java
new file mode 100644
index 00000000000..e543314e2ef
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFDispatch.java
@@ -0,0 +1,89 @@
+/*****************************************************************************
+ * Copyright (c) 2014, 2015 CEA LIST, Christian W. Damus, 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:
+ * CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * Represents a dispatch option for an event of interest going on on the EMF command stack
+ *
+ * @author Laurent Wouters
+ */
+public abstract class EMFDispatch {
+ /**
+ * The current command aggregator
+ */
+ private CompoundCommand aggregator;
+
+ /**
+ * Gets the notifier object of interest, or <code>null</code> if all notifiers are of interest
+ *
+ * @return The notifier object of interest
+ */
+ public abstract EObject getNotifier();
+
+ /**
+ * Gets the changed feature of interest, or <code>null</code> if all features are of interest
+ *
+ * @return The changed feature of interest
+ */
+ public abstract EStructuralFeature getFeature();
+
+ /**
+ * Reacts to the specified change notification
+ *
+ * @param notification
+ * The change notification
+ */
+ public abstract void onChange(Notification notification);
+
+ /**
+ * Reacts to the clearing of the listener
+ */
+ public abstract void onClear();
+
+ /**
+ * Dispatches the specified change notification
+ *
+ * @param notification
+ * The change notification
+ * @param aggregator
+ * The aggregated command being constructed
+ *
+ */
+ public final void dispatch(Notification notification, CompoundCommand aggregator) {
+ this.aggregator = aggregator;
+
+ try {
+ onChange(notification);
+ } finally {
+ this.aggregator = null;
+ }
+ }
+
+ /**
+ * Reacts to a change with the specified command
+ *
+ * @param command
+ * A command
+ */
+ public final void react(Command command) {
+ aggregator.append(command);
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFDispatchManager.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFDispatchManager.java
new file mode 100644
index 00000000000..c1287e01f78
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFDispatchManager.java
@@ -0,0 +1,272 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.NoSuchElementException;
+
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.BasicEMap;
+import org.eclipse.emf.common.util.EMap;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+
+/**
+ * A manager of EMF dispatch registrations.
+ */
+public abstract class EMFDispatchManager<D extends EMFDispatch> {
+
+ private final EMFListener listener;
+
+ protected EMFDispatchManager(EMFListener listener) {
+ super();
+
+ this.listener = listener;
+ }
+
+ /**
+ * Creates a new dispatch manager that can manage multiple dispatches for each sync-item.
+ *
+ * @param listener
+ * the EMF listener that provides notifications
+ * @return a multi-dispatch manager
+ */
+ public static <D extends EMFDispatch> EMFDispatchManager<D> createMultiple(EMFListener listener) {
+ return new Multi<D>(listener);
+ }
+
+ /**
+ * Creates a new dispatch manager that manages a single dispatch for each sync-item.
+ *
+ * @param listener
+ * the EMF listener that provides notifications
+ * @return a single-dispatch manager
+ */
+ public static <D extends EMFDispatch> EMFDispatchManager<D> createSingle(EMFListener listener) {
+ return new Single<D>(listener);
+ }
+
+ public void add(SyncItem<?, ?> syncItem, D dispatch) {
+ put(syncItem, dispatch);
+ listener.add(dispatch);
+ }
+
+ public D getDispatcher(SyncItem<?, ?> syncItem, Object feature) {
+ D result = null;
+
+ for (D next : iterate(syncItem)) {
+ EStructuralFeature nextFeature = next.getFeature();
+ if ((nextFeature == feature) || (nextFeature == null)) {
+ // A null feature indicates that any change triggers the synchronization
+ result = next;
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ protected abstract void put(SyncItem<?, ?> syncItem, D dispatch);
+
+ protected abstract boolean isActive(SyncItem<?, ?> syncItem);
+
+ protected abstract Iterable<SyncItem<?, ?>> getActive();
+
+ protected abstract Iterable<D> iterate(SyncItem<?, ?> syncItem);
+
+ protected abstract Iterable<Map.Entry<SyncItem<?, ?>, D>> activeEntries();
+
+ protected abstract void clear();
+
+ public void remove(SyncItem<?, ?> syncItem) {
+ if (isActive(syncItem)) {
+
+ for (Iterator<D> iter = iterate(syncItem).iterator(); iter.hasNext();) {
+ listener.remove(iter.next());
+ iter.remove();
+ }
+ }
+ }
+
+ public void remove(EMFDispatch dispatch) {
+ for (Iterator<Map.Entry<SyncItem<?, ?>, D>> iter = activeEntries().iterator(); iter.hasNext();) {
+ Map.Entry<SyncItem<?, ?>, D> next = iter.next();
+ if (next.getValue() == dispatch) {
+ listener.remove(dispatch);
+ iter.remove();
+ }
+ }
+ }
+
+ public void removeAll() {
+ for (SyncItem<?, ?> syncItem : getActive()) {
+ for (EMFDispatch next : iterate(syncItem)) {
+ listener.remove(next);
+ }
+ }
+
+ clear();
+ }
+
+ //
+ // Nested types
+ //
+
+ private static final class Multi<D extends EMFDispatch> extends EMFDispatchManager<D> {
+ /**
+ * Currently active dispatchers.
+ */
+ private final Multimap<SyncItem<?, ?>, D> active = ArrayListMultimap.create();
+
+ Multi(EMFListener listener) {
+ super(listener);
+ }
+
+ @Override
+ protected void put(SyncItem<?, ?> syncItem, D dispatch) {
+ active.put(syncItem, dispatch);
+ }
+
+ @Override
+ protected boolean isActive(SyncItem<?, ?> syncItem) {
+ return active.containsKey(syncItem);
+ }
+
+ @Override
+ protected Iterable<SyncItem<?, ?>> getActive() {
+ return active.keySet();
+ }
+
+ @Override
+ protected Iterable<D> iterate(SyncItem<?, ?> syncItem) {
+ return active.get(syncItem);
+ }
+
+ @Override
+ protected Iterable<Entry<SyncItem<?, ?>, D>> activeEntries() {
+ return active.entries();
+ }
+
+ @Override
+ protected void clear() {
+ active.clear();
+ }
+ }
+
+ private static final class Single<D extends EMFDispatch> extends EMFDispatchManager<D> {
+ /**
+ * Currently active dispatchers.
+ */
+ private final EMap<SyncItem<?, ?>, D> active = new BasicEMap<SyncItem<?, ?>, D>() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void didRemove(BasicEMap.Entry<SyncItem<?, ?>, D> entry) {
+ mapping.clear();
+ }
+
+ @Override
+ protected void didClear(BasicEList<BasicEMap.Entry<SyncItem<?, ?>, D>>[] oldEntryData) {
+ mapping.clear();
+ }
+ };
+
+ private final SingletonMapping mapping = new SingletonMapping();
+
+ Single(EMFListener listener) {
+ super(listener);
+ }
+
+ @Override
+ protected void put(SyncItem<?, ?> syncItem, D dispatch) {
+ active.put(syncItem, dispatch);
+ }
+
+ @Override
+ protected boolean isActive(SyncItem<?, ?> syncItem) {
+ return active.containsKey(syncItem);
+ }
+
+ @Override
+ protected Iterable<SyncItem<?, ?>> getActive() {
+ return active.keySet();
+ }
+
+ @Override
+ protected Iterable<D> iterate(SyncItem<?, ?> syncItem) {
+ return mapping.prime(syncItem);
+ }
+
+ @Override
+ protected Iterable<Entry<SyncItem<?, ?>, D>> activeEntries() {
+ return active.entrySet();
+ }
+
+ @Override
+ protected void clear() {
+ active.clear();
+ }
+
+ //
+ // Nested types
+ //
+
+ private final class SingletonMapping implements Iterable<D> {
+ private SyncItem<?, ?> key;
+ private D value;
+
+ private final Iterator<D> iterator = new Iterator<D>() {
+ @Override
+ public boolean hasNext() {
+ return value != null;
+ }
+
+ @Override
+ public D next() {
+ if (value == null) {
+ throw new NoSuchElementException();
+ }
+ D result = value;
+ value = null;
+ return result;
+ }
+
+ @Override
+ public void remove() {
+ active.remove(key);
+ }
+ };
+
+ @Override
+ public Iterator<D> iterator() {
+ return iterator;
+ }
+
+ Iterable<D> prime(SyncItem<?, ?> key) {
+ this.key = key;
+ this.value = active.get(key);
+ return this;
+ }
+
+ void clear() {
+ this.key = null;
+ this.value = null;
+ }
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFListener.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFListener.java
new file mode 100644
index 00000000000..20d2e03288f
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EMFListener.java
@@ -0,0 +1,264 @@
+/*****************************************************************************
+ * Copyright (c) 2014, 2015 CEA LIST, Christian W. Damus, 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:
+ * CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CommandWrapper;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.transaction.NotificationFilter;
+import org.eclipse.emf.transaction.ResourceSetChangeEvent;
+import org.eclipse.emf.transaction.ResourceSetListener;
+import org.eclipse.emf.transaction.RollbackException;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.sync.internal.SyncService;
+import org.eclipse.papyrus.infra.sync.internal.SyncServiceOperation;
+import org.eclipse.papyrus.infra.sync.service.ISyncService;
+import org.eclipse.papyrus.infra.sync.service.SyncServiceRunnable;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+/**
+ * Represents a listener of the EMF command stack for the purpose of the synchronization API
+ *
+ * @author Laurent Wouters
+ */
+public class EMFListener implements ResourceSetListener {
+ private final ISyncService syncService = SyncService.getCurrent();
+ private TransactionalEditingDomain domain;
+
+ /**
+ * The dispatchers by notifier and object and then feature
+ */
+ private Map<EObject, Map<EStructuralFeature, List<EMFDispatch>>> dispatchers;
+
+ /**
+ * Initializes this listener
+ *
+ * @param domain
+ * The associated editing domain
+ */
+ public EMFListener(TransactionalEditingDomain domain) {
+ super();
+
+ // Synchronize objects in the order in which they are registered
+ this.dispatchers = Maps.newLinkedHashMap();
+
+ this.domain = domain;
+ domain.addResourceSetListener(this);
+ }
+
+ /**
+ * Disposes me, forgetting all of my registered dispatchers and disconnecting me from the editing domain that I listen to.
+ */
+ public void dispose() {
+ dispatchers.clear();
+
+ if (domain != null) {
+ domain.removeResourceSetListener(this);
+ domain = null;
+ }
+ }
+
+ /**
+ * Registers the specified dispatch option
+ *
+ * @param dispatcher
+ * A dispatch option
+ */
+ public void add(EMFDispatch dispatcher) {
+ EObject notifier = dispatcher.getNotifier();
+ EStructuralFeature feature = dispatcher.getFeature();
+ Map<EStructuralFeature, List<EMFDispatch>> sub1 = dispatchers.get(notifier);
+ if (sub1 == null) {
+ // Synchronize features in the order in which they are registered
+ sub1 = Maps.newLinkedHashMap();
+ dispatchers.put(notifier, sub1);
+ }
+ List<EMFDispatch> sub2 = sub1.get(dispatcher.getFeature());
+ if (sub2 == null) {
+ sub2 = new ArrayList<EMFDispatch>();
+ sub1.put(feature, sub2);
+ }
+ sub2.add(dispatcher);
+ }
+
+ /**
+ * Removes the specified dispatch option
+ *
+ * @param dispatcher
+ * A dispatch option
+ */
+ public void remove(EMFDispatch dispatcher) {
+ Map<EStructuralFeature, List<EMFDispatch>> sub1 = dispatchers.get(dispatcher.getNotifier());
+ if (sub1 == null) {
+ return;
+ }
+ List<EMFDispatch> sub2 = sub1.get(dispatcher.getFeature());
+ if (sub2 == null) {
+ return;
+ }
+ sub2.remove(dispatcher);
+ }
+
+ @Override
+ public NotificationFilter getFilter() {
+ return NotificationFilter.NOT_TOUCH;
+ }
+
+ @Override
+ public boolean isAggregatePrecommitListener() {
+ return false;
+ }
+
+ @Override
+ public boolean isPrecommitOnly() {
+ return true;
+ }
+
+ @Override
+ public boolean isPostcommitOnly() {
+ return false;
+ }
+
+ @Override
+ public void resourceSetChanged(ResourceSetChangeEvent arg0) {
+ // this is post-commit, do nothing
+ }
+
+ @Override
+ public Command transactionAboutToCommit(final ResourceSetChangeEvent event) throws RollbackException {
+ // this is pre-commit, dispatch and aggregate
+ return syncService.run(new SyncServiceRunnable.Safe<Command>() {
+ /**
+ * A cache of matching dispatchers for this dispatch operation.
+ */
+ private List<EMFDispatch> cache = Lists.newArrayList();
+
+ @Override
+ public Command run(ISyncService syncService) {
+ Command result = null;
+ CompoundCommand compound = null;
+
+ for (Notification notification : event.getNotifications()) {
+ Object objNotifier = notification.getNotifier();
+ Object objFeature = notification.getFeature();
+ if (!(objNotifier instanceof EObject)) {
+ continue;
+ }
+ if (!(objFeature instanceof EStructuralFeature)) {
+ continue;
+ }
+ EObject notifier = (EObject) objNotifier;
+ EStructuralFeature feature = (EStructuralFeature) objFeature;
+
+ addToCache(null, null);
+ addToCache(notifier, null);
+ addToCache(null, feature);
+ addToCache(notifier, feature);
+ if (cache.isEmpty()) {
+ continue;
+ }
+ // instantiate if required
+ if (result == null) {
+ compound = new CompoundCommand();
+ result = new SyncServiceCommandWrapper(syncService, compound);
+ }
+ // dispatch the notification
+ for (EMFDispatch option : cache) {
+ option.dispatch(notification, compound);
+ }
+ // clear the cache
+ cache.clear();
+ }
+ return result;
+ }
+
+ /**
+ * Adds to the cache the dispatching options that matches the specified values
+ *
+ * @param notifier
+ * The notifier object
+ * @param feature
+ * The changed feature
+ */
+ private void addToCache(EObject notifier, EStructuralFeature feature) {
+ Map<EStructuralFeature, List<EMFDispatch>> sub1 = dispatchers.get(notifier);
+ if (sub1 == null) {
+ return;
+ }
+ List<EMFDispatch> sub2 = sub1.get(feature);
+ if (sub2 == null) {
+ return;
+ }
+ for (EMFDispatch dispatch : sub2) {
+ if (!cache.contains(dispatch)) {
+ cache.add(dispatch);
+ }
+ }
+ }
+ });
+ }
+
+ private static class SyncServiceCommandWrapper extends CommandWrapper {
+ private final SyncService syncService;
+
+ SyncServiceCommandWrapper(ISyncService syncService, Command command) {
+ super(command);
+
+ this.syncService = (SyncService) syncService;
+ }
+
+ @Override
+ public void execute() {
+ new SyncServiceOperation<Void>(syncService) {
+ @Override
+ protected Void doCall() throws Exception {
+ SyncServiceCommandWrapper.super.execute();
+ return null;
+ }
+ }.safeCall();
+ }
+
+ @Override
+ public void undo() {
+ new SyncServiceOperation<Void>(syncService) {
+ @Override
+ protected Void doCall() throws Exception {
+ SyncServiceCommandWrapper.super.undo();
+ return null;
+ }
+ }.safeCall();
+ }
+
+ @Override
+ public void redo() {
+ new SyncServiceOperation<Void>(syncService) {
+ @Override
+ protected Void doCall() throws Exception {
+ SyncServiceCommandWrapper.super.redo();
+ return null;
+ }
+ }.safeCall();
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectEAttributeSyncFeature.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectEAttributeSyncFeature.java
new file mode 100644
index 00000000000..41dea338d7d
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectEAttributeSyncFeature.java
@@ -0,0 +1,256 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import java.util.List;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ECollections;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.command.SetCommand;
+
+import com.google.common.base.Objects;
+
+/**
+ * A synchronization feature for synchronizing {@link EAttribute}s between {@link EObject}s.
+ *
+ * @author Laurent Wouters
+ *
+ * @param <M>
+ * The type of the underlying model element common to all synchronized items in a single bucket
+ */
+public class EObjectEAttributeSyncFeature<M extends EObject> extends SyncFeature<M, EObject, Notification> {
+
+ private final EAttribute attribute;
+
+ /**
+ * The active listeners
+ */
+ private EMFDispatchManager<Dispatcher> dispatchMgr = createSingleDispatchManager();
+
+ /**
+ * Initialized this feature
+ *
+ * @param bucket
+ * The bucket doing the synchronization
+ */
+ public EObjectEAttributeSyncFeature(SyncBucket<M, EObject, Notification> bucket, EAttribute attribute) {
+ super(bucket);
+
+ this.attribute = attribute;
+ }
+
+ public static <M extends EObject> EObjectEAttributeSyncFeature<M> create(SyncBucket<M, EObject, Notification> bucket, EAttribute attribute) {
+ return new EObjectEAttributeSyncFeature<M>(bucket, attribute);
+ }
+
+ @Override
+ public void observe(SyncItem<M, EObject> item) {
+ dispatchMgr.add(item, new Dispatcher(item, attribute));
+ }
+
+ @Override
+ public void unobserve(SyncItem<M, EObject> item) {
+ dispatchMgr.remove(item);
+ }
+
+ @Override
+ protected void onClear() {
+ dispatchMgr.removeAll();
+ }
+
+ @Override
+ public void synchronize(SyncItem<M, EObject> from, SyncItem<M, EObject> to, Notification message) {
+ if (message == null) {
+ synchronizeInit(from, to);
+ } else {
+ synchronizeIncrement(from, to, message);
+ }
+ }
+
+ /**
+ * Completely synchronizes the target item with the origin item
+ *
+ * @param from
+ * The origin item
+ * @param to
+ * The target item
+ */
+ private void synchronizeInit(SyncItem<M, EObject> from, SyncItem<M, EObject> to) {
+ Object valueFrom = from.getBackend().eGet(attribute);
+ Object valueTo = to.getBackend().eGet(attribute);
+
+ if (!Objects.equal(valueFrom, valueTo)) {
+ Command command = SetCommand.create(getEditingDomain(), to.getBackend(), attribute, valueFrom);
+ execute(command);
+ }
+ }
+
+ /**
+ * Synchronizes the target item with the specified change
+ *
+ * @param to
+ * The target item
+ * @param message
+ * The change message
+ */
+ private void synchronizeIncrement(SyncItem<M, EObject> from, SyncItem<M, EObject> to, Notification message) {
+ Dispatcher dispatcher = dispatchMgr.getDispatcher(from, message.getFeature());
+
+ switch (message.getEventType()) {
+ case Notification.ADD:
+ dispatcher.handleAdd(from, to, message.getNewValue());
+ break;
+ case Notification.ADD_MANY:
+ for (Object next : (Iterable<?>) message.getNewValue()) {
+ dispatcher.handleAdd(from, to, next);
+ }
+ break;
+ case Notification.REMOVE:
+ dispatcher.handleRemove(from, to, message.getOldValue());
+ break;
+ case Notification.REMOVE_MANY:
+ for (Object next : (Iterable<?>) message.getOldValue()) {
+ dispatcher.handleRemove(from, to, next);
+ }
+ break;
+ case Notification.SET:
+ if (message.getOldValue() != null) {
+ dispatcher.handleRemove(from, to, message.getOldValue());
+ }
+ if (message.getNewValue() != null) {
+ dispatcher.handleAdd(from, to, message.getNewValue());
+ }
+ break;
+ case Notification.UNSET:
+ // A single-valued feature may be unset
+ if (message.getOldValue() instanceof EObject) {
+ dispatcher.handleRemove(from, to, message.getOldValue());
+ }
+ break;
+ }
+ }
+
+ protected Command getAddCommand(SyncItem<M, EObject> from, SyncItem<M, EObject> to, Object value) {
+ return attribute.isMany()
+ ? AddCommand.create(getEditingDomain(), to.getBackend(), attribute, value)
+ : SetCommand.create(getEditingDomain(), to.getBackend(), attribute, value);
+ }
+
+ protected Command getRemoveCommand(SyncItem<M, EObject> from, SyncItem<M, EObject> to, Object value) {
+ return attribute.isMany()
+ ? RemoveCommand.create(getEditingDomain(), to.getBackend(), attribute, value)
+ : SetCommand.create(getEditingDomain(), to.getBackend(), attribute, SetCommand.UNSET_VALUE);
+ }
+
+ /**
+ * Gets the model element associated to the specified back-end object, or <code>null</code> if none is found
+ *
+ * @param backend
+ * the synchronization back-end
+ * @return The associated model element
+ */
+ protected EObject getModelOf(EObject backend) {
+ EObject notifier = getNotifier(backend);
+ return (notifier == null) ? null : getModelOfNotifier(notifier);
+ }
+
+ protected EObject getNotifier(EObject backend) {
+ return backend;
+ }
+
+ protected EObject getModelOfNotifier(EObject backendNotifier) {
+ return backendNotifier;
+ }
+
+ //
+ // Nested types
+ //
+
+ /**
+ * Represents a dispatcher for this feature
+ *
+ * @author Laurent Wouters
+ */
+ private class Dispatcher extends EStructuralFeatureSyncDispatcher<M, EObject> {
+ public Dispatcher(SyncItem<M, EObject> item, EStructuralFeature feature) {
+ super(item, feature);
+ }
+
+ @Override
+ public EObject getNotifier() {
+ return EObjectEAttributeSyncFeature.this.getNotifier(getItem().getBackend());
+ }
+
+ @Override
+ public void onClear() {
+ // clears the parent bucket
+ getBucket().clear();
+ }
+
+ @Override
+ public void onChange(Notification notification) {
+ EObjectEAttributeSyncFeature.this.onChange(getItem(), notification);
+ }
+
+ List<?> getContents(EObject owner) {
+ List<?> result;
+
+ if (attribute.isMany()) {
+ result = (List<?>) owner.eGet(attribute);
+ } else {
+ Object value = owner.eGet(attribute);
+ if (value == null) {
+ result = ECollections.EMPTY_ELIST;
+ } else {
+ result = ECollections.singletonEList(value);
+ }
+ }
+
+ return result;
+ }
+
+ boolean handleAdd(SyncItem<M, EObject> from, SyncItem<M, EObject> to, Object value) {
+ boolean result;
+
+ List<?> values = getContents(to.getBackend());
+ result = !values.contains(value);
+
+ if (result) {
+ react(getAddCommand(from, to, value));
+ }
+
+ return result;
+ }
+
+ boolean handleRemove(SyncItem<M, EObject> from, SyncItem<M, EObject> to, Object value) {
+ boolean result;
+
+ List<?> values = getContents(to.getBackend());
+ result = values.contains(value);
+
+ if (result) {
+ react(getRemoveCommand(from, to, value));
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectEReferenceSyncFeature.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectEReferenceSyncFeature.java
new file mode 100644
index 00000000000..eb791be64b0
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectEReferenceSyncFeature.java
@@ -0,0 +1,122 @@
+/*****************************************************************************
+ * Copyright (c) 2014, 2015 CEA LIST, Christian W. Damus, 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:
+ * CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CommandWrapper;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.util.EContentsEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.FeatureMapUtil;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.DeleteCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.command.SetCommand;
+
+import com.google.common.base.Objects;
+
+/**
+ * A synchronization feature for synchronizing {@link EReference}s between {@link EObject}s.
+ *
+ * @author Laurent Wouters
+ *
+ * @param <M>
+ * The type of the underlying model element common to all synchronized items in a single bucket
+ */
+public abstract class EObjectEReferenceSyncFeature<M extends EObject> extends EStructuralFeatureSyncFeature<M, EObject> {
+ /**
+ * Initialized this feature
+ *
+ * @param bucket
+ * The bucket doing the synchronization
+ */
+ public EObjectEReferenceSyncFeature(SyncBucket<M, EObject, Notification> bucket, EReference reference, EReference... more) {
+ super(bucket, reference, more);
+ }
+
+ @Override
+ protected List<? extends EObject> getContents(EObject backend) {
+ return new EContentsEList<EObject>(backend, features);
+ }
+
+ @Override
+ protected EObject getNotifier(EObject backend) {
+ return backend;
+ }
+
+ @Override
+ protected EObject getModelOfNotifier(EObject backendNotifier) {
+ return backendNotifier;
+ }
+
+ /**
+ * Obtains a command that simply copies the new model element into the same feature of the target.
+ */
+ @Override
+ protected Command doGetAddCommand(final SyncItem<M, EObject> from, final SyncItem<M, EObject> to, final EObject newSource) {
+ EReference reference = getReferencingFeature(from.getBackend(), newSource);
+ final EObject copy = EcoreUtil.copy(newSource);
+
+ return new CommandWrapper(reference.isMany()
+ ? AddCommand.create(getEditingDomain(), to.getBackend(), reference, copy)
+ : SetCommand.create(getEditingDomain(), to.getBackend(), reference, copy)) {
+
+ @Override
+ public Collection<?> getResult() {
+ return Collections.singletonList(copy);
+ }
+ };
+ }
+
+ @Override
+ protected Command doGetRemoveCommand(final SyncItem<M, EObject> from, final EObject oldSource, final SyncItem<M, EObject> to, final EObject oldTarget) {
+ EReference reference = getReferencingFeature(to.getBackend(), oldTarget);
+
+ return reference.isContainment()
+ ? createDeleteCommand(oldTarget)
+ : reference.isMany()
+ ? RemoveCommand.create(getEditingDomain(), to.getBackend(), reference, oldTarget)
+ : SetCommand.create(getEditingDomain(), to.getBackend(), reference, SetCommand.UNSET_VALUE);
+ }
+
+ protected Command createDeleteCommand(EObject object) {
+ return DeleteCommand.create(getEditingDomain(), object);
+ }
+
+ protected EReference getReferencingFeature(EObject owner, EObject referenced) {
+ EReference result = null;
+
+ for (int i = 0; (result == null) && (i < features.length); i++) {
+ if (contains(owner, features[i], referenced)) {
+ result = (EReference) features[i]; // We only allow references in the constructor
+ }
+ }
+
+ return result;
+ }
+
+ private boolean contains(EObject owner, EStructuralFeature feature, Object value) {
+ return FeatureMapUtil.isMany(owner, feature)
+ ? ((Collection<?>) owner.eGet(feature)).contains(value)
+ : Objects.equal(owner.eGet(feature), value);
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectMasterSlaveSyncBucket.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectMasterSlaveSyncBucket.java
new file mode 100644
index 00000000000..0b896837b19
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectMasterSlaveSyncBucket.java
@@ -0,0 +1,32 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * A specialization of the {@link MasterSlaveSyncBucket} that synchronizes EMF objects.
+ */
+public abstract class EObjectMasterSlaveSyncBucket<M extends EObject, T, X> extends MasterSlaveSyncBucket<M, T, X> {
+
+ public EObjectMasterSlaveSyncBucket(M model, T master) {
+ super(model, master);
+ }
+
+ @Override
+ public boolean isActive() {
+ return getMaster().isActive();
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectSyncBucket.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectSyncBucket.java
new file mode 100644
index 00000000000..f657bb2bb4a
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectSyncBucket.java
@@ -0,0 +1,27 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * A specialization of the {@link SyncBucket} that synchronizes EMF objects.
+ */
+public abstract class EObjectSyncBucket<M extends EObject, T, X> extends SyncBucket<M, T, X> {
+
+ public EObjectSyncBucket(M model) throws IllegalArgumentException {
+ super(model);
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectSyncItem.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectSyncItem.java
new file mode 100644
index 00000000000..d15eb1a3da1
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EObjectSyncItem.java
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * An abstract sync item for synchronization with EMF back-ends.
+ */
+public abstract class EObjectSyncItem<M, T extends EObject> extends SyncItem<M, T> {
+
+ public EObjectSyncItem(T backend) {
+ super(backend);
+ }
+
+ @Override
+ public boolean isActive() {
+ boolean result = super.isActive();
+
+ if (result) {
+ EObject eObject = getBackend();
+
+ // Detached objects do not synchronize
+ result = (eObject != null) && (eObject.eResource() != null);
+ }
+
+ return result;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EStructuralFeatureSyncDispatcher.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EStructuralFeatureSyncDispatcher.java
new file mode 100755
index 00000000000..09dac6d408c
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EStructuralFeatureSyncDispatcher.java
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ * Copyright (c) 2014 CEA LIST 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:
+ * CEA LIST - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * A dispatcher of sync notifications for {@link EStructuralFeature}s of {@link EObject}s.
+ *
+ * @author Laurent Wouters
+ */
+public abstract class EStructuralFeatureSyncDispatcher<M extends EObject, T> extends EMFDispatch {
+ /**
+ * The item being listened to
+ */
+ private SyncItem<M, T> item;
+
+ /**
+ * The observed feature
+ */
+ private EStructuralFeature feature;
+
+ /**
+ * Initializes this listener
+ *
+ * @param item
+ * The item being listened to
+ * @param feature
+ * The observed reference feature
+ */
+ public EStructuralFeatureSyncDispatcher(SyncItem<M, T> item, EStructuralFeature feature) {
+ this.item = item;
+ this.feature = feature;
+ }
+
+ /**
+ * Gets the item being listened to
+ *
+ * @return The item being listened to
+ */
+ public SyncItem<M, T> getItem() {
+ return item;
+ }
+
+ @Override
+ public EStructuralFeature getFeature() {
+ return feature;
+ }
+} \ No newline at end of file
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EStructuralFeatureSyncFeature.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EStructuralFeatureSyncFeature.java
new file mode 100644
index 00000000000..f47ca4a5ecc
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/EStructuralFeatureSyncFeature.java
@@ -0,0 +1,535 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.common.command.AbstractCommand;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CommandWrapper;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.command.IdentityCommand;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.ObjectArrays;
+
+/**
+ * A synchronization feature for {@link EStructuralFeature}s of {@link EObject}s.
+ *
+ * @author Laurent Wouters
+ *
+ * @param <M>
+ * The type of the underlying model element common to all synchronized items in a single bucket
+ * @param <T>
+ * The type of the backend element to synchronize
+ */
+public abstract class EStructuralFeatureSyncFeature<M extends EObject, T> extends SyncFeature<M, T, Notification> {
+
+ final EStructuralFeature[] features;
+
+ /**
+ * The active listeners
+ */
+ private EMFDispatchManager<Dispatcher> dispatchMgr = createMultipleDispatchManager();
+
+ /**
+ * Initialized this feature
+ *
+ * @param bucket
+ * The bucket doing the synchronization
+ */
+ public EStructuralFeatureSyncFeature(SyncBucket<M, T, Notification> bucket, EStructuralFeature feature, EStructuralFeature... more) {
+ super(bucket);
+
+ this.features = ObjectArrays.concat(feature, more);
+ }
+
+ /**
+ * Callback for sub-classes of this feature when a new target has been added to a synchronized item
+ *
+ * @param from
+ * the source time
+ * @param source
+ * the corresponding source object
+ * @param to
+ * The target item
+ * @param target
+ * The added target
+ *
+ * @return a command to append to the current synchronization operation
+ */
+ protected Command onTargetAdded(SyncItem<M, T> from, EObject source, SyncItem<M, T> to, T target) {
+ // by default, do nothing
+ return null;
+ }
+
+ /**
+ * Callback for sub-classes of this feature when a new child has been removed from a target synchronized item
+ *
+ * @param to
+ * The target item
+ * @param target
+ * The removed target
+ *
+ * @return a command to append to the current synchronization operation
+ */
+ protected Command onTargetRemoved(SyncItem<M, T> to, T target) {
+ // by default, do nothing
+ return null;
+ }
+
+ /**
+ * Finds and returns the model object in the {@code to} side of a synchronization object that corresponds to
+ * the given source object in the {@code from} side. By default, the {@code sourceModel} is returned as is
+ * for the simple case of synchronizing multiple visualizations on the same model content.
+ *
+ * @param from
+ * the source sync-item of a synchronization operation
+ * @param to
+ * the target sync-item of a synchronization operation
+ * @param sourceModel
+ * an object added to the {@link SyncItem#getModel() model} of the {@code from} item
+ * @return the corresponding object in the {@code model} of the {@code to} item
+ */
+ protected EObject getTargetModel(SyncItem<M, T> from, SyncItem<M, T> to, EObject sourceModel) {
+ return sourceModel;
+ }
+
+ @Override
+ public void observe(SyncItem<M, T> item) {
+ for (EStructuralFeature next : features) {
+ dispatchMgr.add(item, new Dispatcher(item, next));
+ }
+ }
+
+ @Override
+ public void unobserve(SyncItem<M, T> item) {
+ dispatchMgr.remove(item);
+ }
+
+ @Override
+ protected void onClear() {
+ dispatchMgr.removeAll();
+ }
+
+ @Override
+ public void synchronize(SyncItem<M, T> from, SyncItem<M, T> to, Notification message) {
+ if (message == null) {
+ synchronizeInit(from, to);
+ } else {
+ synchronizeIncrement(from, to, message);
+ }
+ }
+
+ protected abstract Iterable<? extends T> getContents(T backend);
+
+ protected boolean match(EObject sourceModel, EObject targetModel) {
+ return sourceModel == targetModel;
+ }
+
+ /**
+ * Completely synchronizes the target item with the origin item
+ *
+ * @param from
+ * The origin item
+ * @param to
+ * The target item
+ */
+ private void synchronizeInit(SyncItem<M, T> from, SyncItem<M, T> to) {
+ Iterable<? extends T> childrenFrom = getContents(from.getBackend());
+ List<? extends T> childrenTo = Lists.newArrayList(getContents(to.getBackend()));
+ List<EObject> toAdd = new ArrayList<EObject>();
+
+ Command additionalCommand = null;
+
+ // find the missing children and the supplementary children in the target (to) item
+ for (T source : childrenFrom) {
+ EObject model = getModelOf(source);
+ boolean found = false;
+ for (Iterator<? extends T> iter = childrenTo.iterator(); iter.hasNext();) {
+ T target = iter.next();
+ EObject potential = getTargetModel(from, to, getModelOf(target));
+ if (match(model, potential)) {
+ found = true;
+ iter.remove();
+
+ // Hook it up for its own synchronization
+ Command additional = onTargetAdded(from, model, to, target);
+ if (additional != null) {
+ additionalCommand = (additionalCommand == null) ? additional : additionalCommand.chain(additional);
+ }
+ break;
+ }
+ }
+ if (!found) {
+ toAdd.add(model);
+ }
+ }
+
+ Command command = null;
+
+ if (!childrenTo.isEmpty() || !toAdd.isEmpty()) {
+ // compute the initial sync command
+ CompoundCommand compound = new CompoundCommand("Initial Sync Command");
+ command = compound;
+
+ // remove the supplementary children of the target item
+ for (int i = 0; i < childrenTo.size(); i++) {
+ compound.append(getRemoveCommand(from, null, to, childrenTo.get(i)));
+ }
+ // add the missing ones
+ for (int i = 0; i < toAdd.size(); i++) {
+ EObject newSource = toAdd.get(i);
+ if (shouldAdd(from, to, newSource)) {
+ Command add = getAddCommand(from, to, newSource);
+ if (add != null) {
+ compound.append(add);
+ }
+ }
+ }
+ }
+
+ if (additionalCommand != null) {
+ command = (command == null) ? additionalCommand : command.chain(additionalCommand);
+ }
+
+ if (command != null) {
+ execute(command);
+ }
+ }
+
+ /**
+ * Synchronizes the target item with the specified change
+ *
+ * @param to
+ * The target item
+ * @param message
+ * The change message
+ */
+ private void synchronizeIncrement(SyncItem<M, T> from, SyncItem<M, T> to, Notification message) {
+ Dispatcher dispatcher = dispatchMgr.getDispatcher(from, message.getFeature());
+
+ switch (message.getEventType()) {
+ case Notification.ADD:
+ dispatcher.handleAdd(from, to, (EObject) message.getNewValue());
+ break;
+ case Notification.ADD_MANY:
+ for (Object next : (Iterable<?>) message.getNewValue()) {
+ dispatcher.handleAdd(from, to, (EObject) next);
+ }
+ break;
+ case Notification.REMOVE:
+ dispatcher.handleRemove(from, to, (EObject) message.getOldValue());
+ break;
+ case Notification.REMOVE_MANY:
+ for (Object next : (Iterable<?>) message.getOldValue()) {
+ dispatcher.handleRemove(from, to, (EObject) next);
+ }
+ break;
+ case Notification.SET:
+ if (message.getOldValue() != null) {
+ dispatcher.handleRemove(from, to, (EObject) message.getOldValue());
+ }
+ if (message.getNewValue() != null) {
+ dispatcher.handleAdd(from, to, (EObject) message.getNewValue());
+ }
+ break;
+ case Notification.UNSET:
+ // A single-valued feature may be unset
+ if (message.getOldValue() instanceof EObject) {
+ dispatcher.handleRemove(from, to, (EObject) message.getOldValue());
+ }
+ break;
+ }
+ }
+
+ /**
+ * Queries whether a new source object should be added {@code to} the synchronization target in synchronization
+ * {@code from} a synchronization source. The default implementation always adds.
+ *
+ * @param from
+ * the source of a synchronization operation
+ * @param to
+ * the target of a synchronization operation
+ * @param newSource
+ * the new element added to the source
+ *
+ * @return whether the new element should be synchronized to the target
+ */
+ protected boolean shouldAdd(SyncItem<M, T> from, SyncItem<M, T> to, EObject newSource) {
+ return true;
+ }
+
+ /**
+ * Gets the synchronization command for adding a new back-end to the specified target to correspond to a new source model element.
+ *
+ * @param from
+ * The source item of the synchronization
+ * @param to
+ * The target item to synchronize
+ * @param newSource
+ * The new source object for which a corresponding target is to be added
+ * @return The command
+ */
+ protected Command getAddCommand(final SyncItem<M, T> from, final SyncItem<M, T> to, final EObject newSource) {
+ return new CommandWrapper(doGetAddCommand(from, to, newSource)) {
+ private T addedTarget;
+
+ @Override
+ public void execute() {
+ super.execute();
+
+ @SuppressWarnings("unchecked")
+ T newTarget = (T) getCommand().getResult().iterator().next();
+ addedTarget = newTarget;
+
+ Command additional = onTargetAdded(from, newSource, to, addedTarget);
+ if (additional != null) {
+ additional.execute();
+ }
+ }
+
+ @Override
+ public void undo() {
+ super.undo();
+ Command additional = onTargetRemoved(to, addedTarget);
+ if (additional != null) {
+ additional.execute();
+ }
+ }
+
+ @Override
+ public void redo() {
+ super.redo();
+ Command additional = onTargetAdded(from, newSource, to, addedTarget);
+ if (additional != null) {
+ additional.execute();
+ }
+ }
+ };
+ }
+
+ protected Command doGetAddCommand(SyncItem<M, T> from, SyncItem<M, T> to, EObject newSource) {
+ throw new UnsupportedOperationException("doGetAddCommand"); //$NON-NLS-1$
+ }
+
+ /**
+ * Gets the synchronization command for removing a back-end from the specified target on removal of its corresponding source model.
+ *
+ * @param from
+ * The source item of the synchronization
+ * @param oldSource
+ * the source object to which the {@code oldTarget} had corresponded. May be {@code null} in the case of an
+ * initial synchronization where we have found targets that have no corresponding sources and that thus need to be removed
+ * @param to
+ * The target item to synchronize
+ * @param oldTarget
+ * The old back-end object that is to be removed
+ * @return The command
+ */
+ protected Command getRemoveCommand(final SyncItem<M, T> from, final EObject oldSource, final SyncItem<M, T> to, final T oldTarget) {
+ return new CommandWrapper(doGetRemoveCommand(from, oldSource, to, oldTarget)) {
+ @Override
+ public void execute() {
+ super.execute();
+ Command additional = onTargetRemoved(to, oldTarget);
+ if (additional != null) {
+ additional.execute();
+ }
+ }
+
+ @Override
+ public void undo() {
+ super.undo();
+
+ // Only notify of add if we had done that in the first place (this is not an initial sync that is being undone)
+ if (oldSource != null) {
+ Command additional = onTargetAdded(from, oldSource, to, oldTarget);
+ if (additional != null) {
+ additional.execute();
+ }
+ }
+ }
+
+ @Override
+ public void redo() {
+ super.redo();
+ Command additional = onTargetRemoved(to, oldTarget);
+ if (additional != null) {
+ additional.execute();
+ }
+ }
+ };
+ }
+
+ protected Command doGetRemoveCommand(SyncItem<M, T> from, EObject oldSource, SyncItem<M, T> to, T oldTarget) {
+ throw new UnsupportedOperationException("doGetRemoveCommand"); //$NON-NLS-1$
+ }
+
+ /**
+ * Gets the model element associated to the specified back-end object, or <code>null</code> if none is found
+ *
+ * @param backend
+ * the synchronization back-end
+ * @return The associated model element
+ */
+ protected EObject getModelOf(T backend) {
+ EObject notifier = getNotifier(backend);
+ return (notifier == null) ? null : getModelOfNotifier(notifier);
+ }
+
+ protected abstract EObject getNotifier(T backend);
+
+ protected abstract EObject getModelOfNotifier(EObject backendNotifier);
+
+ /**
+ * Obtains a command that wraps a given {@code command} in a command registers a back-end element for synchronization
+ * on execute and redo and deregisters it on undo.
+ *
+ * @param registry
+ * the synchronization registry in which to register the back-end for synchronization
+ * @param backend
+ * the element to synchronize
+ * @param command
+ * the command to wrap. May be {@code null}, in which case we only perform the registration changes
+ *
+ * @return the wrapper command (never {@code null})
+ */
+ protected Command synchronizingWrapper(final SyncRegistry<?, ? super T, Notification> registry, final T backend, Command command) {
+ class Wrapper extends CommandWrapper {
+ Wrapper() {
+ super();
+ }
+
+ Wrapper(Command command) {
+ super(command);
+ }
+
+ @Override
+ public void execute() {
+ super.execute();
+
+ registry.synchronize(backend);
+ }
+
+ @Override
+ public void undo() {
+ registry.desynchronize(backend);
+
+ super.undo();
+ }
+
+ @Override
+ public void redo() {
+ super.redo();
+
+ registry.synchronize(backend);
+ }
+ }
+
+ class CleanWrapper extends Wrapper implements AbstractCommand.NonDirtying {
+
+ CleanWrapper() {
+ super();
+ }
+
+ @Override
+ protected Command createCommand() {
+ // When we don't have a command to wrap
+ return IdentityCommand.INSTANCE;
+ }
+
+ }
+
+ return (command == null) ? new CleanWrapper() : new Wrapper(command);
+ }
+
+ //
+ // Nested types
+ //
+
+ /**
+ * Represents a dispatcher for this feature
+ *
+ * @author Laurent Wouters
+ */
+ private class Dispatcher extends EStructuralFeatureSyncDispatcher<M, T> {
+ public Dispatcher(SyncItem<M, T> item, EStructuralFeature feature) {
+ super(item, feature);
+ }
+
+ @Override
+ public EObject getNotifier() {
+ return EStructuralFeatureSyncFeature.this.getNotifier(getItem().getBackend());
+ }
+
+ @Override
+ public void onClear() {
+ // clears the parent bucket
+ getBucket().clear();
+ }
+
+ @Override
+ public void onChange(Notification notification) {
+ EStructuralFeatureSyncFeature.this.onChange(getItem(), notification);
+ }
+
+ EObject getModelOf(EObject notifier) {
+ return EStructuralFeatureSyncFeature.this.getModelOfNotifier(notifier);
+ }
+
+ boolean handleAdd(SyncItem<M, T> from, SyncItem<M, T> to, EObject object) {
+ boolean result = true; // In case the target has no children at all, yet
+
+ EObject model = getModelOf(object);
+ Iterable<? extends T> children = getContents(to.getBackend());
+ for (Iterator<? extends T> iter = children.iterator(); !result && iter.hasNext();) {
+ T potential = iter.next();
+ result = !match(model, EStructuralFeatureSyncFeature.this.getModelOf(potential));
+ }
+
+ if (result && shouldAdd(from, to, model)) {
+ Command add = getAddCommand(from, to, model);
+ if (add != null) {
+ react(add);
+ }
+ }
+
+ return result;
+ }
+
+ boolean handleRemove(SyncItem<M, T> from, SyncItem<M, T> to, EObject object) {
+ boolean result = false;
+
+ EObject model = getModelOf(object);
+ Iterable<? extends T> children = getContents(to.getBackend());
+ for (Iterator<? extends T> iter = children.iterator(); !result && iter.hasNext();) {
+ T potential = iter.next();
+ result = match(model, EStructuralFeatureSyncFeature.this.getModelOf(potential));
+ if (result) {
+ react(getRemoveCommand(from, model, to, potential));
+ }
+ }
+
+ return result;
+ }
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/ISyncObject.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/ISyncObject.java
new file mode 100644
index 00000000000..a7e5de27462
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/ISyncObject.java
@@ -0,0 +1,86 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.sync.service.ISyncService;
+import org.eclipse.papyrus.infra.sync.service.SyncServiceRunnable;
+
+import com.google.common.util.concurrent.CheckedFuture;
+
+/**
+ * Common interface of objects in the synchronization framework.
+ */
+public interface ISyncObject {
+ /**
+ * Queries whether I am currently being actively synchronized. The only reason why I should not
+ * be synchronized is that I pertain to an object that is no longer in the model.
+ *
+ * @return whether I am participating in synchronization
+ */
+ boolean isActive();
+
+ /**
+ * Obtains a sync registry of a particular type.
+ *
+ * @param registryType
+ * the sync registry to retrieve
+ * @return the registry (never {@code null} because it is created on-demand if necessary)
+ *
+ * @throws IllegalStateException
+ * if the registry could not be instantiated for some reason
+ */
+ <M, T, X, R extends SyncRegistry<M, T, X>> R getSyncRegistry(Class<R> registryType);
+
+ /**
+ * Runs an operation in the context of the {@link ISyncService} that owns me.
+ * The {@link SyncServiceRunnable.Safe Safe} variant does not throw a checked exception.
+ *
+ * @param operation
+ * a sync-service operation
+ * @return the result of the {@code operation}, if it completes without throwing
+ *
+ * @throws X
+ * a checked exception that the {@code operation} may optionally declare
+ *
+ * @see SyncServiceRunnable.Safe
+ */
+ <V, X extends Exception> V run(SyncServiceRunnable<V, X> operation) throws X;
+
+ /**
+ * Asynchronously runs an operation in the context of the {@link ISyncService} that owns me.
+ * The {@link SyncServiceRunnable.Safe Safe} variant does not throw a checked exception.
+ *
+ * @param operation
+ * a sync-service operation
+ * @return the future result of the {@code operation}
+ *
+ * @see SyncServiceRunnable.Safe
+ */
+ <V, X extends Exception> CheckedFuture<V, X> runAsync(SyncServiceRunnable<V, X> operation);
+
+ TransactionalEditingDomain getEditingDomain();
+
+ /**
+ * Executes the specified {@code command} in the context of the current {@linkplain #getEditingDomain() editing domain}.
+ * If the domain has a read/write transaction in progress, then the command is executed as a nested transaction.
+ * Otherwise, it is assumed that the context of the command is an initial synchronization on opening a model or diagram
+ * and the command is executed in an unprotected write transaction.
+ *
+ * @param command
+ * a command to execute in the current editing domain
+ */
+ void execute(Command command);
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/MasterSlaveSyncBucket.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/MasterSlaveSyncBucket.java
new file mode 100644
index 00000000000..19c4efd6605
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/MasterSlaveSyncBucket.java
@@ -0,0 +1,81 @@
+/*****************************************************************************
+ * Copyright (c) 2014, 2015 CEA LIST, Christian W. Damus, 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:
+ * Laurent Wouters laurent.wouters@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.sync;
+
+import org.eclipse.papyrus.infra.sync.policy.ISyncPolicy;
+
+/**
+ * Represents a sync bucket for a synchronization from a master item to a set of slave items
+ *
+ * @author Laurent Wouters
+ *
+ * @param <M>
+ * The type of the underlying model element common to all synchronized items in a single bucket
+ * @param <T>
+ * The type of the backend element to synchronize
+ * @param <X>
+ * The type of change message carried by sync requests in this bucket
+ */
+public abstract class MasterSlaveSyncBucket<M, T, X> extends SyncBucket<M, T, X> {
+ /**
+ * The master element
+ */
+ protected SyncItem<M, T> master;
+
+ /**
+ * Initializes this bucket
+ *
+ * @param model
+ * The common model element for all items in this bucket
+ * @param master
+ * The master backend element
+ */
+ public MasterSlaveSyncBucket(M model, T master) {
+ super(model);
+ this.master = encapsulate(master);
+ }
+
+ /**
+ * Gets the master item
+ *
+ * @return The master item
+ */
+ public SyncItem<M, T> getMaster() {
+ return master;
+ }
+
+ @Override
+ protected void onNew(SyncItem<M, T> item) {
+ // sync the new element with master
+ final ISyncPolicy policy = getSyncService().getSyncPolicy();
+ for (SyncFeature<M, T, X> feature : policy.filter(master, item, getFeatures())) {
+ policy.observe(item, feature); // Watch for triggers to override synchronization of this feature
+ feature.synchronize(master, item, null);
+ }
+ }
+
+ @Override
+ protected void onNew(SyncFeature<M, T, X> feature) {
+ // observe the master
+ feature.observe(master);
+
+ // sync all slaves according to the feature
+ final ISyncPolicy policy = getSyncService().getSyncPolicy();
+ for (SyncItem<M, T> item : policy.filter(master, getItems(), feature)) {
+ policy.observe(item, feature); // Watch for triggers to override synchronization of this feature
+ feature.synchronize(master, item, null);
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncBucket.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncBucket.java
new file mode 100644
index 00000000000..adf39509494
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncBucket.java
@@ -0,0 +1,340 @@
+/*****************************************************************************
+ * Copyright (c) 2014, 2015 CEA LIST, Christian W. Damus, 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:
+ * Laurent Wouters laurent.wouters@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.sync;
+
+import java.util.ArrayDeque;
+import java.util.List;
+import java.util.Queue;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+/**
+ * Represents a bucket of synchronized items.
+ * A bucket contains synchronized items but has no assumption of which one, if any is the source of synchronization events.
+ * All items in a bucket are however synchronized on the same events.
+ * All items must then refer to the same model element (of type M).
+ * The real client (backend) elements to synchronize are the elements of type T encapsulated into the SyncItems.
+ * A bucket is associated with a set of synchronization feature (SyncFeature), defining which aspects of the elements in this bucket must be synchronize.
+ *
+ * @author Laurent Wouters
+ *
+ * @param <M>
+ * The type of the underlying model element common to all synchronized items in a single bucket
+ * @param <T>
+ * The type of the backend element to synchronize
+ */
+public abstract class SyncBucket<M, T, X> extends SyncObject {
+ /**
+ * The model element common to all synchronized items in this bucket
+ */
+ private M model;
+ /**
+ * The synchronized features
+ */
+ private List<SyncFeature<M, T, X>> features;
+ /**
+ * The slave synchronized items
+ */
+ private SyncItemList<M, T> items;
+ /**
+ * The pending synchronization requests
+ */
+ private Queue<SyncRequest<M, T, X>> requests;
+ /**
+ * The synchronization request currently being processed
+ */
+ private SyncRequest<M, T, X> currentRequest;
+
+
+ /**
+ * Gets the model element common to all synchronized items in this bucket
+ *
+ * @return The model element common to all synchronized items in this bucket
+ */
+ public M getModel() {
+ return model;
+ }
+
+ /**
+ * Initializes this bucket for the specified common model element
+ *
+ * @param model
+ * The common model element for all items in this bucket
+ * @throws IllegalArgumentException
+ * when the model element is null
+ */
+ public SyncBucket(M model) throws IllegalArgumentException {
+ super();
+
+ if (model == null) {
+ throw new IllegalArgumentException("The model element must not be null");
+ }
+ this.model = model;
+ this.features = Lists.newArrayListWithExpectedSize(2);
+ this.items = new SyncItemList<M, T>();
+ this.requests = new ArrayDeque<SyncRequest<M, T, X>>();
+ }
+
+ boolean checkEnabled() {
+ boolean result = isActive();
+
+ if (!result) {
+ // Bucket is dead
+ clear();
+ }
+
+ return result;
+ }
+
+ /**
+ * Gets the synchronization item corresponding to the given backend element in this bucket
+ *
+ * @param element
+ * A backend element
+ * @throws IllegalArgumentException
+ * When the specified element is null
+ */
+ public SyncItem<M, T> get(T element) throws IllegalArgumentException {
+ if (element == null) {
+ throw new IllegalArgumentException("The specified element must not be null");
+ }
+ return checkEnabled() ? items.get(element) : null;
+ }
+
+ protected Iterable<SyncItem<M, T>> getItems() {
+ return items;
+ }
+
+ public T findBackend(final Predicate<? super T> predicate) {
+ Predicate<SyncItem<M, T>> itemPredicate = new Predicate<SyncItem<M, T>>() {
+ @Override
+ public boolean apply(SyncItem<M, T> input) {
+ return predicate.apply(input.getBackend());
+ }
+ };
+ SyncItem<M, T> item = Iterables.find(getItems(), itemPredicate, null);
+ return (item == null) ? null : item.getBackend();
+ }
+
+ /**
+ * Adds the specified element to this bucket to be synchronize
+ *
+ * @param element
+ * A backend element
+ * @throws IllegalArgumentException
+ * When the specified element is null
+ */
+ public SyncItem<M, T> add(T element) throws IllegalArgumentException {
+ if (element == null) {
+ throw new IllegalArgumentException("The specified element must not be null");
+ }
+ if (!checkEnabled()) {
+ return null;
+ }
+
+ SyncItem<M, T> result = items.get(element);
+ if (result == null) {
+ result = encapsulate(element);
+ items.add(result);
+ onNew(result);
+ }
+
+ return result;
+ }
+
+ /**
+ * Removes the specified element from this bucket
+ *
+ * @param element
+ * An element to remove
+ * @return the corresponding sync item that was removed, if any
+ * @throws IllegalArgumentException
+ * When the specified element is null
+ */
+ public SyncItem<M, T> remove(T element) throws IllegalArgumentException {
+ if (element == null) {
+ throw new IllegalArgumentException("The specified element must not be null");
+ }
+ if (!checkEnabled()) {
+ return null;
+ }
+
+ SyncItem<M, T> result = items.get(element);
+ if (result != null) {
+ items.remove(result);
+ }
+
+ return result;
+ }
+
+ /**
+ * Queries whether the specified back-end element is synchronized by this bucket.
+ *
+ * @param backEnd
+ * a potentially synchronized back-end
+ *
+ * @return whether the back-end is synchronized by this bucket, even if this is now obsolete
+ * knowledge because either or both are no longer {@linkplain ISyncObject#isActive() active}
+ */
+ public boolean synchronizes(T backend) {
+ return items.get(backend) != null;
+ }
+
+ protected Iterable<SyncFeature<M, T, X>> getFeatures() {
+ return features;
+ }
+
+ /**
+ * Adds the specified synchronization feature to this bucket
+ *
+ * @param feature
+ * A synchronization feature
+ * @throws IllegalArgumentException
+ * When the specified feature is null
+ */
+ public void add(SyncFeature<M, T, X> feature) throws IllegalArgumentException {
+ if (feature == null) {
+ throw new IllegalArgumentException("The specified element must not be null");
+ }
+ if (!checkEnabled()) {
+ return;
+ }
+ features.add(feature);
+ onNew(feature);
+ }
+
+ /**
+ * Removes the specified synchronization feature from this bucket
+ *
+ * @param feature
+ * A synchronization feature
+ * @throws IllegalArgumentException
+ * When the specified feature is null
+ */
+ public void remove(SyncFeature<M, T, X> feature) throws IllegalArgumentException {
+ if (feature == null) {
+ throw new IllegalArgumentException("The specified element must not be null");
+ }
+ if (!checkEnabled()) {
+ return;
+ }
+ features.remove(feature);
+ }
+
+ /**
+ * Clears this bucket
+ */
+ public void clear() {
+ for (SyncFeature<M, T, X> feature : features) {
+ feature.clear();
+ }
+ model = null;
+ features.clear();
+ items.clear();
+ requests.clear();
+ }
+
+ /**
+ * Propagates the specified change
+ *
+ * @param feature
+ * The propagating feature
+ * @param origin
+ * The item at the origin of the change
+ * @param message
+ * The change message
+ */
+ public void propagate(SyncFeature<M, T, X> feature, SyncItem<M, T> origin, X message) {
+ if (!accept(feature, origin, message)) {
+ return;
+ }
+
+ requests.add(new SyncRequest<M, T, X>(feature, origin, message));
+
+ // If we are not already processing requests, process them now
+ if (currentRequest == null) {
+ try {
+ for (currentRequest = requests.poll(); currentRequest != null; currentRequest = requests.poll()) {
+ executeCurrentRequest();
+ }
+ } finally {
+ // In case of exception
+ currentRequest = null;
+ }
+ }
+ }
+
+ /**
+ * Executes a synchronization request
+ *
+ * @param request
+ * The request to execute
+ */
+ private void executeCurrentRequest() {
+ final SyncItem<M, T> from = currentRequest.getOrigin();
+ final SyncFeature<M, T, X> feature = currentRequest.getFeature();
+
+ for (SyncItem<M, T> to : getSyncService().getSyncPolicy().filter(from, getItems(), feature)) {
+ feature.synchronize(from, to, currentRequest.getMessage());
+ }
+ }
+
+ /**
+ * Encapsulates the specified element into an synchronized item for this bucket
+ *
+ * @param element
+ * An element to synchronize
+ * @return The encapsulating item
+ */
+ protected abstract SyncItem<M, T> encapsulate(T element);
+
+ /**
+ * Callback for the initialization of new synchronized items
+ *
+ * @param item
+ * The new item to initialize
+ */
+ protected void onNew(SyncItem<M, T> item) {
+ // by default, do nothing
+ }
+
+ /**
+ * Callback for the initialization of new synchronization features
+ *
+ * @param feature
+ * The new synchronization feature
+ */
+ protected void onNew(SyncFeature<M, T, X> feature) {
+ // by default, do nothing
+ }
+
+ /**
+ * Determines whether to accept the specified incoming synchronization request for processing.
+ *
+ * @param feature
+ * The propagating feature
+ * @param origin
+ * The item at the origin of the change
+ * @param message
+ * The change message
+ * @return <code>true</code> if the request shall be processed
+ */
+ protected boolean accept(SyncFeature<M, T, X> feature, SyncItem<M, T> origin, X message) {
+ // by default, accept all
+ return true;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncFeature.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncFeature.java
new file mode 100644
index 00000000000..8f45aaff118
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncFeature.java
@@ -0,0 +1,137 @@
+/*****************************************************************************
+ * Copyright (c) 2014, 2015 CEA LIST, Christian W. Damus, 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:
+ * Laurent Wouters laurent.wouters@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.sync;
+
+import org.eclipse.papyrus.infra.tools.util.TypeUtils;
+
+/**
+ * Represents a synchronized feature (i.e. the property that is being synchronized) between synchronized elements
+ *
+ * @author Laurent Wouters
+ *
+ * @param <M>
+ * The type of the underlying model element common to all synchronized items in a single bucket
+ * @param <T>
+ * The type of the backend element to synchronize
+ * @param <X>
+ * The type of change message carried by sync requests on this feature
+ */
+public abstract class SyncFeature<M, T, X> extends SyncObject {
+ /**
+ * The bucket doing the synchronization
+ */
+ private SyncBucket<M, T, X> bucket;
+
+ /**
+ * Initialized this feature
+ *
+ * @param bucket
+ * The bucket doing the synchronization
+ */
+ public SyncFeature(SyncBucket<M, T, X> bucket) {
+ super(bucket.getSyncService());
+
+ this.bucket = bucket;
+ }
+
+ /**
+ * I am enabled if my {@linkplain #getBucket() bucket} is enabled.
+ *
+ * @return whether my bucket is enabled
+ */
+ @Override
+ public boolean isActive() {
+ return getBucket().isActive();
+ }
+
+ /**
+ * Registers observers for this feature on the specified item
+ *
+ * @param item
+ * The item to observe
+ */
+ public abstract void observe(SyncItem<M, T> item);
+
+ /**
+ * Unregisters observers for this feature on the specified item
+ *
+ * @param item
+ * The item to cease to observe
+ */
+ public abstract void unobserve(SyncItem<M, T> item);
+
+ /**
+ * Synchronizes an item according to this feature
+ *
+ * @param from
+ * The original item that raised the change
+ * @param to
+ * The item to be synchronized
+ * @param message
+ * The change message
+ */
+ public abstract void synchronize(SyncItem<M, T> from, SyncItem<M, T> to, X message);
+
+ protected final SyncBucket<M, T, X> getBucket() {
+ return bucket;
+ }
+
+ /**
+ * Informs this feature that the associated bucket is being cleared.
+ * This feature should clean up its remaining resources (listeners).
+ */
+ public void clear() {
+ onClear();
+ bucket = null;
+ }
+
+ /**
+ * The callback for cleaning up custom resources
+ */
+ protected void onClear() {
+ // by default, do nothing
+ }
+
+ /**
+ * The callback to use when an observed item changed
+ *
+ * @param origin
+ * The observed item that raised the change
+ * @param message
+ * The change message
+ */
+ protected void onChange(SyncItem<M, T> origin, X message) {
+ bucket.propagate(this, origin, message);
+ }
+
+ /**
+ * In the case that my sync-bucket is a {@link MasterSlaveSyncBucket}, obtains its master sync-item.
+ *
+ * @return my bucket's master sync-item, or {@code null} if it is not a master-slave sync-bucket
+ */
+ protected final SyncItem<M, T> getMaster() {
+ @SuppressWarnings("unchecked")
+ MasterSlaveSyncBucket<M, T, X> msb = TypeUtils.as(getBucket(), MasterSlaveSyncBucket.class);
+ return (msb == null) ? null : msb.getMaster();
+ }
+
+ protected final <D extends EMFDispatch> EMFDispatchManager<D> createSingleDispatchManager() {
+ return getSyncService().createSingleDispatchManager();
+ }
+
+ protected final <D extends EMFDispatch> EMFDispatchManager<D> createMultipleDispatchManager() {
+ return getSyncService().createMultipleDispatchManager();
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncItem.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncItem.java
new file mode 100644
index 00000000000..17872f651e8
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncItem.java
@@ -0,0 +1,75 @@
+/*****************************************************************************
+ * Copyright (c) 2014, 2015 CEA LIST, Christian W. Damus, 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:
+ * Laurent Wouters laurent.wouters@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.sync;
+
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+
+/**
+ * Encapsulate an item that can be synchronized with others in a bucket
+ *
+ * @author Laurent Wouters
+ *
+ * @param <M>
+ * The type of the underlying model element common to all
+ * synchronized items in a single bucket
+ * @param <T>
+ * The type of the backend element to synchronize
+ */
+public abstract class SyncItem<M, T> extends SyncObject {
+ private final Reference<T> backend;
+
+ /**
+ * Initializes this item
+ *
+ * @param backend
+ * The backend element to synchronize
+ * @throws NullPointerException
+ * when the backend element is null
+ */
+ public SyncItem(T backend) {
+ if (backend == null) {
+ throw new NullPointerException("The backend element must not be null");
+ }
+
+ this.backend = new WeakReference<>(backend);
+ }
+
+ /**
+ * Gets the backend element that is being synchronized
+ *
+ * @return The backend element (guaranteed to be non-{@code null} if I am {@link ISyncObject#isActive()} active)
+ */
+ public final T getBackend() {
+ return backend.get();
+ }
+
+ /**
+ * Gets the model element common to all items in a bucket
+ *
+ * @return The model element, or {@code null} if the item is no longer {@link ISyncObject#isActive() enabled}
+ */
+ public abstract M getModel();
+
+ /**
+ * I am enabled if my back-end can still be retrieved.
+ *
+ * @return whether my {@link #getBackend() backend} is non-{@code null}
+ */
+ @Override
+ public boolean isActive() {
+ return backend.get() != null;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncItemList.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncItemList.java
new file mode 100644
index 00000000000..ab25c28b371
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncItemList.java
@@ -0,0 +1,205 @@
+/*****************************************************************************
+ * Copyright (c) 2014, 2015 CEA LIST, Christian W. Damus, 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:
+ * Laurent Wouters laurent.wouters@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.sync;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.google.common.collect.AbstractIterator;
+
+/**
+ * Represents a list of synchronized item that automatically cleans itself in order to remove dead items
+ *
+ * @author Laurent Wouters
+ *
+ * @param <M>
+ * The type of the underlying model element common to all synchronized items in a single bucket
+ * @param <T>
+ * The type of the backend element to synchronize
+ */
+class SyncItemList<M, T> implements Iterable<SyncItem<M, T>> {
+ /**
+ * The backend list
+ */
+ private List<SyncItem<M, T>> items;
+
+ /**
+ * Initializes this list
+ */
+ public SyncItemList() {
+ this.items = new ArrayList<SyncItem<M, T>>();
+ }
+
+ @Override
+ public Iterator<SyncItem<M, T>> iterator() {
+ return new AbstractIterator<SyncItem<M, T>>() {
+
+ private final Iterator<SyncItem<M, T>> delegate = items.iterator();
+
+ @Override
+ protected SyncItem<M, T> computeNext() {
+ while (delegate.hasNext()) {
+ SyncItem<M, T> item = delegate.next();
+ if (!item.isActive()) {
+ delegate.remove(); // Clean it out
+ } else {
+ return item;
+ }
+ }
+
+ return endOfData();
+ }
+ };
+ }
+
+ /**
+ * Gets an iterator over live backend elements
+ *
+ * @return An iterator over live backend elements
+ */
+ public Iterator<T> backendIterator() {
+ return new AbstractIterator<T>() {
+
+ private final Iterator<SyncItem<M, T>> delegate = items.iterator();
+
+ @Override
+ protected T computeNext() {
+ while (delegate.hasNext()) {
+ T backend = delegate.next().getBackend();
+ if (backend == null) {
+ delegate.remove(); // Clean it out
+ } else {
+ return backend;
+ }
+ }
+
+ return endOfData();
+ }
+ };
+ }
+
+ /**
+ * Gets whether this list contains an item for the specified backend element
+ *
+ * @param item
+ * A backend element to look for
+ * @return {@code true} if the specified backend element is currently synchronized with this bucket
+ * @throws IllegalArgumentException
+ * when the specified element is null
+ */
+ public boolean contains(T item) throws IllegalArgumentException {
+ if (item == null) {
+ throw new IllegalArgumentException("The specified element must not be null");
+ }
+
+ for (int i = 0; i != items.size(); i++) {
+ SyncItem<M, T> potential = items.get(i);
+ T backend = potential.getBackend();
+ if (backend == null) {
+ // cleanup dead item
+ items.remove(i);
+ i--;
+ continue;
+ } else if (backend == item) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Gets the list item in this list corresponding to the specified backend element
+ *
+ * @param item
+ * A backend element to look for
+ * @return The corresponding item, or <code>null</code> if it was not found
+ * @throws IllegalArgumentException
+ * When the specified element is null
+ */
+ public SyncItem<M, T> get(T item) throws IllegalArgumentException {
+ if (item == null) {
+ throw new IllegalArgumentException("The specified element must not be null");
+ }
+
+ for (int i = 0; i != items.size(); i++) {
+ SyncItem<M, T> potential = items.get(i);
+ T backend = potential.getBackend();
+ if (backend == null) {
+ // cleanup dead item
+ items.remove(i);
+ i--;
+ continue;
+ } else if (backend == item) {
+ return potential;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Adds the specified item to this list
+ *
+ * @param item
+ * The item to add
+ * @throws IllegalArgumentException
+ * When the specified item is null or dead
+ */
+ public void add(SyncItem<M, T> item) throws IllegalArgumentException {
+ if (item == null) {
+ throw new IllegalArgumentException("null item");
+ }
+ if (!item.isActive()) {
+ throw new IllegalArgumentException("item is not enabled");
+ }
+
+ items.add(item);
+ }
+
+ /**
+ * Removes the specified item from this list
+ *
+ * @param item
+ * The item to remove
+ * @throws IllegalArgumentException
+ * When the specified item is null
+ */
+ public void remove(SyncItem<M, T> item) {
+ if (item == null) {
+ throw new IllegalArgumentException("null item");
+ }
+
+ for (int i = 0; i != items.size(); i++) {
+ SyncItem<M, T> potential = items.get(i);
+ if (!potential.isActive()) {
+ // cleanup dead item
+ items.remove(i);
+ i--;
+ continue;
+ }
+ if (potential == item) {
+ items.remove(i);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Clears all item from this list
+ */
+ public void clear() {
+ items.clear();
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncObject.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncObject.java
new file mode 100644
index 00000000000..091749e718b
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncObject.java
@@ -0,0 +1,75 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.sync.internal.SyncService;
+import org.eclipse.papyrus.infra.sync.service.ISyncService;
+import org.eclipse.papyrus.infra.sync.service.SyncServiceRunnable;
+
+import com.google.common.util.concurrent.CheckedFuture;
+
+/**
+ * A core synchronization framework object.
+ */
+public abstract class SyncObject implements ISyncObject {
+
+ private final ISyncService syncService;
+
+ SyncObject() {
+ this(SyncService.getCurrent());
+ }
+
+ SyncObject(ISyncService syncService) {
+ super();
+
+ if (syncService == null) {
+ throw new IllegalStateException("Must be created within a SyncServiceRunnable"); //$NON-NLS-1$
+ }
+
+ this.syncService = syncService;
+ }
+
+ final ISyncService getSyncService() {
+ return syncService;
+ }
+
+ @Override
+ public TransactionalEditingDomain getEditingDomain() {
+ return getSyncService().getEditingDomain();
+ }
+
+ @Override
+ public <V, X extends Exception> V run(SyncServiceRunnable<V, X> operation) throws X {
+ return getSyncService().run(operation);
+ }
+
+ @Override
+ public <M, T, X, R extends SyncRegistry<M, T, X>> R getSyncRegistry(Class<R> registryType) {
+ return getSyncService().getSyncRegistry(registryType);
+ }
+
+ @Override
+ public void execute(Command command) {
+ getSyncService().execute(command);
+ }
+
+ @Override
+ public <V, X extends Exception> CheckedFuture<V, X> runAsync(SyncServiceRunnable<V, X> operation) {
+ CheckedFuture<V, X> result = operation.asFuture(this);
+ getSyncService().getAsyncExecutor().execute((Runnable) result);
+ return result;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncRegistry.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncRegistry.java
new file mode 100644
index 00000000000..07b7209dfcc
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncRegistry.java
@@ -0,0 +1,229 @@
+/*****************************************************************************
+ * Copyright (c) 2014, 2015 CEA LIST, Christian W. Damus, 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:
+ * Laurent Wouters laurent.wouters@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 465416
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.sync;
+
+import java.util.Map;
+
+import org.eclipse.papyrus.infra.sync.service.ISyncService;
+import org.eclipse.papyrus.infra.sync.service.SyncServiceRunnable;
+
+import com.google.common.collect.Maps;
+import com.google.common.reflect.TypeToken;
+
+/**
+ * Represents a registry of synchronization buckets
+ *
+ * @author Laurent Wouters
+ *
+ * @param <M>
+ * The type of the underlying model element common to all synchronized items in a single bucket
+ * @param <T>
+ * The type of the backend element to synchronize
+ * @param <X>
+ * The type of change message carried by sync requests
+ */
+public abstract class SyncRegistry<M, T, X> extends SyncObject {
+ private final Class<M> modelType;
+ private final Class<T> backendType;
+
+ /**
+ * The registry of buckets
+ */
+ private final Map<M, SyncBucket<M, T, X>> buckets;
+
+ /**
+ * Initializes this registry
+ */
+ @SuppressWarnings("unchecked")
+ public SyncRegistry() {
+ super();
+
+ @SuppressWarnings("serial")
+ TypeToken<M> modelType = new TypeToken<M>(getClass()) {
+ };
+ this.modelType = (Class<M>) modelType.getRawType();
+
+ @SuppressWarnings("serial")
+ TypeToken<T> backendType = new TypeToken<T>(getClass()) {
+ };
+ this.backendType = (Class<T>) backendType.getRawType();
+
+ // Synchronize buckets in the order in which they are registered
+ this.buckets = Maps.newLinkedHashMap();
+ }
+
+ public final Class<M> getModelType() {
+ return modelType;
+ }
+
+ public final Class<T> getBackendType() {
+ return backendType;
+ }
+
+ /**
+ * A sync registry is always active.
+ *
+ * @return {@code true}
+ */
+ @Override
+ public boolean isActive() {
+ return true;
+ }
+
+ /**
+ * Gets the front-end model element for the specified {@code backend} element.
+ *
+ * @param backend
+ * A back-end element
+ * @return The corresponding front-end model element
+ */
+ protected abstract M getModelOf(T backend);
+
+ /**
+ * Gets the registered bucket for the specified model.
+ *
+ * @param model
+ * A model element
+ * @return The registered bucket for the specified {@code model}, or {@code null} if no {@linkplain ISyncObject#isActive() enabled} bucket
+ * exists for the {@code model}
+ */
+ public SyncBucket<M, T, X> getBucket(M model) {
+ SyncBucket<M, T, X> result = buckets.get(model);
+
+ if ((result != null) && !result.isActive()) {
+ buckets.remove(result);
+ result = null;
+ }
+
+ return result;
+ }
+
+ /**
+ * Registers the specified bucket
+ *
+ * @param bucket
+ * A bucket
+ */
+ public void register(SyncBucket<M, T, X> bucket) {
+ if (!bucket.isActive()) {
+ return;
+ }
+ buckets.put(bucket.getModel(), bucket);
+ }
+
+ /**
+ * Unregisters the specified bucket
+ *
+ * @param bucket
+ * A bucket
+ */
+ public void unregister(SyncBucket<M, T, X> bucket) {
+ if (!bucket.isActive()) {
+ return;
+ }
+ buckets.remove(bucket.getModel());
+ }
+
+ /**
+ * Determines whether the specified element is synchronized
+ *
+ * @param element
+ * An element
+ * @return <code>true</code> if the element is synchronized
+ */
+ public boolean isSynchronized(T element) {
+ SyncBucket<M, T, X> bucket = getBucketFor(element);
+ if (bucket == null) {
+ return false;
+ }
+ return (bucket.get(element) != null);
+ }
+
+ /**
+ * Synchronizes the specified element
+ *
+ * @param element
+ * An element
+ */
+ public void synchronize(final T element) {
+ final SyncBucket<M, T, X> bucket = getBucketFor(element);
+ if (bucket == null) {
+ return;
+ }
+
+ run(new SyncServiceRunnable.Safe<SyncItem<M, T>>() {
+ @Override
+ public SyncItem<M, T> run(ISyncService syncService) {
+ return bucket.add(element);
+ }
+ });
+ }
+
+ /**
+ * Desynchronizes the specified element
+ *
+ * @param element
+ * An element
+ */
+ public void desynchronize(final T element) {
+ final SyncBucket<M, T, X> bucket = getBucketFor(element);
+ if (bucket == null) {
+ return;
+ }
+
+ run(new SyncServiceRunnable.Safe<SyncItem<M, T>>() {
+ @Override
+ public SyncItem<M, T> run(ISyncService syncService) {
+ return bucket.remove(element);
+ }
+ });
+ }
+
+ /**
+ * Queries whether the specified back-end element is synchronized by this registry in the bucket for the
+ * given front-end {@code model}.
+ *
+ * @param backEnd
+ * a potentially synchronized back-end
+ * @param model
+ * a front-end of synchronization
+ *
+ * @return whether the back-end is synchronized with the given {@code model}, even if this is now obsolete
+ * knowledge because either or both are no longer {@linkplain ISyncObject#isActive() active}
+ */
+ public boolean synchronizes(final T backEnd, final M model) {
+ SyncBucket<M, T, X> bucket = buckets.get(model);
+ return (bucket != null) && bucket.synchronizes(backEnd);
+ }
+
+ /**
+ * Determines the appropriate bucket for the specified element
+ *
+ * @param element
+ * An element
+ * @return The appropriate bucket, or {@code null} if no {@linkplain ISyncObject#isActive() active} bucket
+ * exists for the {@code element}
+ */
+ public SyncBucket<M, T, X> getBucketFor(T element) {
+ if (element == null) {
+ return null;
+ }
+ M frontend = getModelOf(element);
+ if (frontend == null) {
+ return null;
+ }
+ return getBucket(frontend);
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncRequest.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncRequest.java
new file mode 100755
index 00000000000..b513bea3ad8
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/SyncRequest.java
@@ -0,0 +1,85 @@
+/*****************************************************************************
+ * Copyright (c) 2014 CEA LIST.
+ *
+ *
+ * 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:
+ * Laurent Wouters laurent.wouters@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync;
+
+/**
+ * Represents a synchronization request
+ *
+ * @author Laurent Wouters
+ *
+ * @param <M>
+ * The type of the underlying model element common to all synchronized items in a single bucket
+ * @param <T>
+ * The type of the backend element to synchronize
+ * @param <X>
+ * The type of change message carried by the sync request
+ */
+public class SyncRequest<M, T, X> {
+ /**
+ * The synchronized feature
+ */
+ private SyncFeature<M, T, X> feature;
+ /**
+ * The item originating the change
+ */
+ private SyncItem<M, T> origin;
+ /**
+ * The change message
+ */
+ private X message;
+
+ /**
+ * Gets the synchronized feature
+ *
+ * @return The synchronized feature
+ */
+ public SyncFeature<M, T, X> getFeature() {
+ return feature;
+ }
+
+ /**
+ * Gets the item originating the change
+ *
+ * @return The item originating the change
+ */
+ public SyncItem<M, T> getOrigin() {
+ return origin;
+ }
+
+ /**
+ * Gets the change message
+ *
+ * @return The change message
+ */
+ public X getMessage() {
+ return message;
+ }
+
+ /**
+ * Initializes this request
+ *
+ * @param feature
+ * The synchronized feature
+ * @param origin
+ * The item originating the change
+ * @param message
+ * The change message
+ */
+ public SyncRequest(SyncFeature<M, T, X> feature, SyncItem<M, T> origin, X message) {
+ this.feature = feature;
+ this.origin = origin;
+ this.message = message;
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/NullSyncPolicy.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/NullSyncPolicy.java
new file mode 100644
index 00000000000..2f9bf7589b1
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/NullSyncPolicy.java
@@ -0,0 +1,48 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.internal;
+
+import org.eclipse.papyrus.infra.sync.SyncFeature;
+import org.eclipse.papyrus.infra.sync.SyncItem;
+import org.eclipse.papyrus.infra.sync.policy.ISyncPolicy;
+
+/**
+ * A non-policy for synchronization, which just lets everything be synchronized all the time.
+ */
+class NullSyncPolicy implements ISyncPolicy {
+
+ NullSyncPolicy() {
+ super();
+ }
+
+ @Override
+ public <M, T> boolean shouldSynchronize(SyncItem<M, T> from, SyncItem<M, T> to, SyncFeature<M, T, ?> feature) {
+ return true;
+ }
+
+ @Override
+ public <M, T> Iterable<? extends SyncItem<M, T>> filter(SyncItem<M, T> from, Iterable<? extends SyncItem<M, T>> to, SyncFeature<M, T, ?> feature) {
+ return to;
+ }
+
+ @Override
+ public <M, T, X> Iterable<? extends SyncFeature<M, T, X>> filter(SyncItem<M, T> from, SyncItem<M, T> to, Iterable<? extends SyncFeature<M, T, X>> features) {
+ return features;
+ }
+
+ @Override
+ public <M, T> void observe(SyncItem<M, T> syncTarget, SyncFeature<M, T, ?> feature) {
+ // There's no need to observe for changes in synchronizability because a priori everything is always synchronized
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncPolicyDelegateRegistryImpl.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncPolicyDelegateRegistryImpl.java
new file mode 100644
index 00000000000..189e6d796eb
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncPolicyDelegateRegistryImpl.java
@@ -0,0 +1,91 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.internal;
+
+import static org.eclipse.papyrus.infra.core.utils.TransactionHelper.isTriggerTransaction;
+
+import java.util.concurrent.ConcurrentMap;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.transaction.ResourceSetChangeEvent;
+import org.eclipse.emf.transaction.RollbackException;
+import org.eclipse.emf.transaction.Transaction;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.sync.EMFListener;
+import org.eclipse.papyrus.infra.sync.SyncFeature;
+import org.eclipse.papyrus.infra.sync.policy.ISyncPolicyDelegate;
+
+import com.google.common.collect.MapMaker;
+
+/**
+ * Default implementation of the sync-policy delegate registry.
+ */
+class SyncPolicyDelegateRegistryImpl implements ISyncPolicyDelegate.Registry {
+ @SuppressWarnings("rawtypes")
+ private ConcurrentMap<Class<? extends SyncFeature>, ISyncPolicyDelegate<?, ?>> delegates = new MapMaker().weakKeys().makeMap();
+
+ private EMFListener listener;
+
+ SyncPolicyDelegateRegistryImpl(TransactionalEditingDomain domain) {
+ super();
+
+ this.listener = createEMFListener(domain);
+ }
+
+ void dispose() {
+ delegates.clear();
+
+ if (listener != null) {
+ listener.dispose();
+ listener = null;
+ }
+ }
+
+ EMFListener getEMFListener() {
+ return listener;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <M, T> ISyncPolicyDelegate<M, T> get(SyncFeature<M, T, ?> syncFeature) {
+ return (ISyncPolicyDelegate<M, T>) delegates.get(syncFeature.getClass());
+ }
+
+ @Override
+ public void register(ISyncPolicyDelegate<?, ?> policyDelegate, Class<?> featureType) {
+ delegates.putIfAbsent(featureType.asSubclass(SyncFeature.class), policyDelegate);
+ }
+
+ @Override
+ public void deregister(ISyncPolicyDelegate<?, ?> policyDelegate, Class<?> featureType) {
+ delegates.remove(featureType.asSubclass(SyncFeature.class), policyDelegate);
+ }
+
+ private EMFListener createEMFListener(TransactionalEditingDomain domain) {
+ return new EMFListener(domain) {
+ @Override
+ public Command transactionAboutToCommit(ResourceSetChangeEvent event) throws RollbackException {
+ // Don't respond to changes made by triggers because these are not explicit by the
+ // user and they include the changes effected by synchronization in the first place.
+ // We only want to detect the original user-initiated changes.
+ // Note that initial-sync changes made in an unprotected transaction wouldn't trigger
+ // the listener in any case
+ Transaction transaction = event.getTransaction();
+ return (transaction != null && isTriggerTransaction(transaction))
+ ? null
+ : super.transactionAboutToCommit(event);
+ }
+ };
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncService.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncService.java
new file mode 100644
index 00000000000..1d461d6f1a1
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncService.java
@@ -0,0 +1,414 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.IdentityCommand;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.transaction.RollbackException;
+import org.eclipse.emf.transaction.Transaction;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.transaction.impl.InternalTransaction;
+import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
+import org.eclipse.papyrus.infra.core.resource.ResourceAdapter;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
+import org.eclipse.papyrus.infra.core.utils.ServiceUtils;
+import org.eclipse.papyrus.infra.core.utils.TransactionHelper;
+import org.eclipse.papyrus.infra.sync.Activator;
+import org.eclipse.papyrus.infra.sync.EMFDispatch;
+import org.eclipse.papyrus.infra.sync.EMFDispatchManager;
+import org.eclipse.papyrus.infra.sync.EMFListener;
+import org.eclipse.papyrus.infra.sync.SyncRegistry;
+import org.eclipse.papyrus.infra.sync.policy.DefaultSyncPolicy;
+import org.eclipse.papyrus.infra.sync.policy.ISyncPolicy;
+import org.eclipse.papyrus.infra.sync.policy.SyncPolicyDelegate;
+import org.eclipse.papyrus.infra.sync.service.ISyncAction;
+import org.eclipse.papyrus.infra.sync.service.ISyncService;
+import org.eclipse.papyrus.infra.sync.service.ISyncTrigger;
+import org.eclipse.papyrus.infra.sync.service.SyncServiceRunnable;
+import org.eclipse.papyrus.infra.tools.util.TypeUtils;
+
+import com.google.common.collect.Maps;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+
+/**
+ * Default implementation of the synchronization service.
+ */
+public class SyncService implements ISyncService {
+
+ private static final ThreadLocal<SyncService> currentService = new ThreadLocal<SyncService>();
+
+ private ServicesRegistry services;
+
+ private TransactionalEditingDomain editingDomain;
+
+ private RootTrigger rootTrigger = new RootTrigger();
+
+ private EMFListener emfListener;
+
+ private SyncPolicyDelegateRegistryImpl policyDelegates;
+
+ private ISyncPolicy policy;
+
+ private Executor executor;
+
+ private final Map<Class<? extends SyncRegistry<?, ?, ?>>, SyncRegistry<?, ?, ?>> syncRegistries = Maps.newHashMap();
+
+ public SyncService() {
+ super();
+ }
+
+ public static SyncService getCurrent() {
+ return currentService.get();
+ }
+
+ @Override
+ public void init(ServicesRegistry servicesRegistry) throws ServiceException {
+ this.services = servicesRegistry;
+ }
+
+ @Override
+ public void startService() throws ServiceException {
+ editingDomain = ServiceUtils.getInstance().getTransactionalEditingDomain(services);
+
+ setAsyncExecutor(TransactionHelper.createTransactionExecutor(editingDomain, MoreExecutors.sameThreadExecutor()));
+
+ policy = new SyncServiceOperation<ISyncPolicy>(this) {
+ @Override
+ protected ISyncPolicy doCall() throws Exception {
+ policyDelegates = new SyncPolicyDelegateRegistryImpl(editingDomain);
+ return new DefaultSyncPolicy(policyDelegates);
+ }
+ }.safeCall(ServiceException.class);
+
+ rootTrigger.install(editingDomain);
+ }
+
+ @Override
+ public void disposeService() throws ServiceException {
+ // No disposal protocol for these
+ syncRegistries.clear();
+
+ policy = null;
+
+ if (policyDelegates != null) {
+ policyDelegates.dispose();
+ policyDelegates = null;
+ }
+
+ if (emfListener != null) {
+ emfListener.dispose();
+ emfListener = null;
+ }
+
+ if (editingDomain != null) {
+ rootTrigger.uninstall(editingDomain);
+ }
+ editingDomain = null;
+
+ if (executor instanceof ExecutorService) {
+ // No sense in running any pending operations because the whole editing environment is gone
+ ((ExecutorService) executor).shutdownNow();
+ }
+ executor = null;
+ }
+
+ @Override
+ public boolean isActive() {
+ return editingDomain != null;
+ }
+
+ EMFListener getEMFListener() {
+ if (emfListener == null) {
+ emfListener = new EMFListener(editingDomain);
+ }
+ return emfListener;
+ }
+
+ @Override
+ public <D extends EMFDispatch> EMFDispatchManager<D> createSingleDispatchManager() {
+ return new SyncServiceOperation<EMFDispatchManager<D>>(this) {
+ @Override
+ protected EMFDispatchManager<D> doCall() throws Exception {
+ return EMFDispatchManager.createSingle(getEMFListener());
+ }
+ }.safeCall();
+ }
+
+ @Override
+ public <D extends EMFDispatch> EMFDispatchManager<D> createMultipleDispatchManager() {
+ return new SyncServiceOperation<EMFDispatchManager<D>>(this) {
+ @Override
+ protected EMFDispatchManager<D> doCall() throws Exception {
+ return EMFDispatchManager.createMultiple(getEMFListener());
+ }
+ }.safeCall();
+ }
+
+ @Override
+ public <M, T, X, R extends SyncRegistry<M, T, X>> R getSyncRegistry(final Class<R> registryType) {
+ try {
+ return new SyncServiceOperation<R>(this) {
+ @Override
+ protected R doCall() throws Exception {
+ R result = TypeUtils.as(syncRegistries.get(registryType), registryType);
+
+ if (result == null) {
+ try {
+ result = registryType.newInstance();
+ } catch (InstantiationException e) {
+ throw new ServiceException("Failed to instantiate sync registry.", e);
+ } catch (IllegalAccessException e) {
+ throw new ServiceException("Insufficient permission to instantiate sync registry.", e);
+ }
+ syncRegistries.put(registryType, result);
+ }
+
+ return result;
+ }
+ }.safeCall(ServiceException.class);
+ } catch (ServiceException e) {
+ Activator.log.error("Failed to access sync registry of type " + registryType.getName(), e);
+ return null;
+ }
+ }
+
+ @Override
+ public IStatus evaluateTriggers(final Object object) {
+ return new SyncServiceOperation<IStatus>(this) {
+ @Override
+ protected IStatus doCall() {
+ IStatus result = Status.OK_STATUS;
+
+ for (ISyncTrigger trigger : SyncTriggerRegistry.getInstance().getSyncTriggers(object)) {
+ ISyncAction action = trigger.trigger(SyncService.this, object);
+ if (action != null) {
+ IStatus nextResult = action.perform(SyncService.this, object);
+ if ((nextResult != null) && !nextResult.isOK()) {
+ if (result.isOK()) {
+ result = nextResult;
+ } else if (result.isMultiStatus()) {
+ ((MultiStatus) result).merge(nextResult);
+ } else {
+ result = new MultiStatus(Activator.PLUGIN_ID, 0, new IStatus[] { result, nextResult }, "Multiple sync trigger evaluation problems occurred.", null);
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+ }.safeCall();
+ }
+
+ @Override
+ public <V, X extends Exception> V run(final SyncServiceRunnable<V, X> operation) throws X {
+ return new SyncServiceOperation<V>(this) {
+ @Override
+ protected V doCall() throws Exception {
+ try {
+ return operation.run(getCurrent());
+ } catch (Throwable t) {
+ throw new InvocationTargetException(t);
+ }
+ }
+ }.safeCall(operation.getExceptionType());
+ }
+
+ @Override
+ public TransactionalEditingDomain getEditingDomain() {
+ return editingDomain;
+ }
+
+ <V> V perform(SyncServiceOperation<V> operation) throws Exception {
+ V result;
+
+ final SyncService restore = currentService.get();
+ currentService.set(this);
+ try {
+ result = operation.doCall();
+ } finally {
+ if (restore == null) {
+ currentService.remove();
+ } else {
+ currentService.set(restore);
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public void execute(Command command) {
+ if (!command.canExecute()) {
+ throw new IllegalArgumentException("unexecutable command"); //$NON-NLS-1$
+ }
+
+ if (command instanceof IdentityCommand) {
+ return;
+ }
+
+ InternalTransactionalEditingDomain domain = TypeUtils.as(editingDomain, InternalTransactionalEditingDomain.class);
+ if (domain == null) {
+ // Easy
+ command.execute();
+ } else {
+ Transaction active = domain.getActiveTransaction();
+ if ((active == null) || active.isReadOnly()) {
+ try {
+ // Need to execute an unprotected write
+ InternalTransaction transaction = domain.startTransaction(false, Collections.singletonMap(Transaction.OPTION_UNPROTECTED, true));
+ try {
+ command.execute();
+ } finally {
+ transaction.commit();
+ }
+ } catch (InterruptedException e) {
+ // This would be weird
+ Activator.log.error(e);
+ } catch (RollbackException e) {
+ // The only thing that can cause an unprotected write to roll back is a run-time exception
+ Activator.log.error("Unprotected synchronization update rolled back. See next log entry for the cause.", null); //$NON-NLS-1$
+ Activator.log.log(e.getStatus());
+ }
+ } else if (Boolean.TRUE.equals(active.getOptions().get(Transaction.OPTION_UNPROTECTED))) {
+ // Already in an unprotected context? Just execute the command
+ command.execute();
+ } else {
+ // Papyrus uses a nesting command stack, so just execute the command and it will happen in a nested transaction
+ domain.getCommandStack().execute(command);
+ }
+ }
+ }
+
+ @Override
+ public ISyncPolicy getSyncPolicy() {
+ return policy;
+ }
+
+ @Override
+ public void setSyncPolicy(ISyncPolicy syncPolicy) {
+ this.policy = (syncPolicy == null) ? new NullSyncPolicy() : syncPolicy;
+ }
+
+ /**
+ * Registers a synchronization policy delegate with me.
+ *
+ * @param policyDelegate
+ * the policy delegate to register
+ * @param featureType
+ * the feature type on which to register it
+ *
+ * @return the listener on which the policy delegate must attach dispatchers for reacting to changes in the synchronized feature(s)
+ */
+ public EMFListener register(SyncPolicyDelegate<?, ?> policyDelegate, Class<?> featureType) {
+ policyDelegates.register(policyDelegate, featureType);
+ return policyDelegates.getEMFListener();
+ }
+
+ /**
+ * De-registers a former synchronization policy delegate.
+ *
+ * @param policyDelegate
+ * the policy delegate to de-register
+ * @param featureType
+ * the feature type from which to de-register it
+ */
+ public void deregister(SyncPolicyDelegate<?, ?> policyDelegate, Class<?> featureType) {
+ policyDelegates.deregister(policyDelegate, featureType);
+ }
+
+ @Override
+ public synchronized Executor getAsyncExecutor() {
+ return executor;
+ }
+
+ @Override
+ public synchronized void setAsyncExecutor(Executor executor) {
+ if (executor == null) {
+ throw new IllegalArgumentException("null executor");
+ }
+
+ if (executor != this.executor) {
+ if (this.executor instanceof ExecutorService) {
+ ((ExecutorService) this.executor).shutdown();
+ }
+ this.executor = executor;
+ }
+ }
+
+ @Override
+ public <V, X extends Exception> CheckedFuture<V, X> runAsync(SyncServiceRunnable<V, X> operation) {
+ CheckedFuture<V, X> result = operation.asFuture(this);
+ getAsyncExecutor().execute((Runnable) result);
+ return result;
+ }
+
+ //
+ // Nested types
+ //
+
+ private class RootTrigger extends ResourceAdapter.Transactional {
+ RootTrigger() {
+ super();
+ }
+
+ @Override
+ protected void handleResourceLoaded(Resource resource) {
+ IStatus status = Status.OK_STATUS;
+
+ // Process existing roots
+ for (EObject root : resource.getContents()) {
+ IStatus nextResult = processRoot(resource, root);
+ if ((nextResult != null) && !nextResult.isOK()) {
+ if (status.isOK()) {
+ status = nextResult;
+ } else if (status.isMultiStatus()) {
+ ((MultiStatus) status).merge(nextResult);
+ } else {
+ status = new MultiStatus(Activator.PLUGIN_ID, 0, new IStatus[] { status, nextResult }, "Multiple sync trigger evaluation problems occurred.", null);
+ }
+ }
+ }
+
+ if (!status.isOK()) {
+ Activator.log.log(status);
+ }
+ }
+
+ @Override
+ protected void handleRootAdded(Resource resource, EObject root) {
+ IStatus status = processRoot(resource, root);
+ if (!status.isOK()) {
+ Activator.log.log(status);
+ }
+ }
+
+ protected IStatus processRoot(Resource resource, EObject root) {
+ return evaluateTriggers(root);
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncServiceOperation.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncServiceOperation.java
new file mode 100644
index 00000000000..23a97a85cd8
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncServiceOperation.java
@@ -0,0 +1,81 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.UndeclaredThrowableException;
+import java.util.concurrent.Callable;
+
+import org.eclipse.emf.common.util.WrappedException;
+
+/**
+ * Internal protocol for operations in the context of the {@link SyncService}.
+ * All {@link SyncService} methods that can call out to client code (plug-in
+ * extensions, listeners, etc.) must be implement as one of these operations.
+ */
+public abstract class SyncServiceOperation<V> implements Callable<V> {
+ private final SyncService service;
+
+ public SyncServiceOperation(SyncService service) {
+ super();
+
+ this.service = service;
+ }
+
+ @Override
+ public final V call() throws Exception {
+ return service.perform(this);
+ }
+
+ public final <X extends Throwable> V safeCall(Class<X> expected) throws X {
+ V result;
+
+ try {
+ result = call();
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ // unwrap
+ if (e instanceof InvocationTargetException) {
+ Throwable t = ((InvocationTargetException) e).getTargetException();
+ if (t instanceof Error) {
+ // Always re-throw these
+ throw (Error) t;
+ } else {
+ e = (Exception) t;
+ }
+ } else if (e instanceof WrappedException) {
+ e = ((WrappedException) e).exception();
+ }
+
+ if (e instanceof RuntimeException) {
+ // Just re-throw it
+ throw (RuntimeException) e;
+ }
+
+ if (expected.isInstance(e)) {
+ throw expected.cast(e);
+ }
+ throw new UndeclaredThrowableException(e);
+ }
+
+ return result;
+ }
+
+ public final V safeCall() {
+ return safeCall(RuntimeException.class);
+ }
+
+ protected abstract V doCall() throws Exception;
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncTriggerRegistry.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncTriggerRegistry.java
new file mode 100644
index 00000000000..9750b616d23
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/internal/SyncTriggerRegistry.java
@@ -0,0 +1,167 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.internal;
+
+import java.util.List;
+
+import org.eclipse.core.expressions.EvaluationContext;
+import org.eclipse.core.expressions.EvaluationResult;
+import org.eclipse.core.expressions.Expression;
+import org.eclipse.core.expressions.ExpressionConverter;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.papyrus.infra.sync.Activator;
+import org.eclipse.papyrus.infra.sync.service.AbstractSyncTrigger;
+import org.eclipse.papyrus.infra.sync.service.ISyncAction;
+import org.eclipse.papyrus.infra.sync.service.ISyncService;
+import org.eclipse.papyrus.infra.sync.service.ISyncTrigger;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+/**
+ * Static registry of synchronization trigger plug-in extensions.
+ */
+public class SyncTriggerRegistry {
+ private static final String EXT_PT = Activator.PLUGIN_ID + ".triggers"; //$NON-NLS-1$
+
+ private static final String E_TRIGGER = "syncTrigger"; //$NON-NLS-1$
+
+ private static final String E_ENABLEMENT = "enablement"; //$NON-NLS-1$
+
+ private static final String A_CLASS = "class"; //$NON-NLS-1$
+
+ private static SyncTriggerRegistry INSTANCE = new SyncTriggerRegistry();
+
+ private final List<ISyncTrigger> syncTriggers = Lists.newArrayList();
+
+ private SyncTriggerRegistry() {
+ super();
+
+ for (IConfigurationElement next : Platform.getExtensionRegistry().getConfigurationElementsFor(EXT_PT)) {
+ if (E_TRIGGER.equals(next.getName())) {
+ syncTriggers.add(new SyncTriggerDescriptor(next));
+ }
+ }
+ }
+
+ public static SyncTriggerRegistry getInstance() {
+ return INSTANCE;
+ }
+
+ public Iterable<ISyncTrigger> getSyncTriggers(final Object object) {
+ return Iterables.filter(syncTriggers, new Predicate<ISyncTrigger>() {
+ @Override
+ public boolean apply(ISyncTrigger input) {
+ return input.isTriggeredOn(object);
+ }
+ });
+ }
+
+ //
+ // Nested types
+ //
+
+ private static class SyncNoop implements ISyncAction {
+ static final SyncNoop INSTANCE = new SyncNoop();
+
+ @Override
+ public IStatus perform(ISyncService syncService, Object object) {
+ return Status.OK_STATUS;
+ }
+ }
+
+ private static class NullSyncTrigger extends AbstractSyncTrigger {
+ static final NullSyncTrigger INSTANCE = new NullSyncTrigger();
+
+ @Override
+ public boolean isTriggeredOn(Object object) {
+ return false;
+ }
+
+ @Override
+ public ISyncAction trigger(ISyncService syncService, Object object) {
+ return SyncNoop.INSTANCE;
+ }
+ }
+
+ static class SyncTriggerDescriptor implements ISyncTrigger {
+ private final IConfigurationElement config;
+
+ private Expression enablement;
+
+ private ISyncTrigger resolved;
+
+ SyncTriggerDescriptor(IConfigurationElement config) {
+ super();
+
+ this.config = config;
+ this.enablement = getEnablement(config);
+ }
+
+ private Expression getEnablement(IConfigurationElement config) {
+ Expression result = null;
+
+ IConfigurationElement[] enablements = config.getChildren(E_ENABLEMENT);
+ if (enablements.length > 0) {
+ try {
+ result = ExpressionConverter.getDefault().perform(enablements[0]);
+ } catch (CoreException e) {
+ result = Expression.FALSE;
+ Activator.log.log(e.getStatus());
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public boolean isTriggeredOn(Object object) {
+ try {
+ return (enablement == null)
+ ? resolve().isTriggeredOn(object)
+ : EvaluationResult.TRUE.equals(enablement.evaluate(new EvaluationContext(null, object)));
+ } catch (CoreException e) {
+ enablement = Expression.FALSE;
+ Activator.log.error("Sync trigger enablement expression failed. The trigger is disabled: " + config.getContributor().getName(), e); //$NON-NLS-1$
+ return false;
+ }
+ }
+
+ ISyncTrigger resolve() {
+ if (resolved == null) {
+ try {
+ resolved = (ISyncTrigger) config.createExecutableExtension(A_CLASS);
+ } catch (CoreException e) {
+ resolved = NullSyncTrigger.INSTANCE;
+ Activator.log.error("Failed to create sync trigger. The trigger is disabled: " + config.getContributor().getName(), e); //$NON-NLS-1$
+ } catch (ClassCastException e) {
+ resolved = NullSyncTrigger.INSTANCE;
+ Activator.log.error("Sync trigger does not implement ISyncTrigger interface. The trigger is disabled: " + config.getContributor().getName(), e); //$NON-NLS-1$
+ }
+ }
+
+ return resolved;
+ }
+
+ @Override
+ public ISyncAction trigger(ISyncService syncService, Object object) {
+ return resolve().trigger(syncService, object);
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/DefaultSyncPolicy.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/DefaultSyncPolicy.java
new file mode 100644
index 00000000000..52f80e183ca
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/DefaultSyncPolicy.java
@@ -0,0 +1,77 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.policy;
+
+import org.eclipse.papyrus.infra.sync.SyncFeature;
+import org.eclipse.papyrus.infra.sync.SyncItem;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+/**
+ * A default implementation of the synchronization policy, which relies on the {@linkplain ISyncPolicyDelegate.Registry registered}
+ * policy {@linkplain ISyncPolicyDelegate delegates} to makes its decisions. Any {@linkplain SyncFeature feature} that does
+ * not have a delegate is synchronized by default.
+ */
+public class DefaultSyncPolicy implements ISyncPolicy {
+ private final ISyncPolicyDelegate.Registry delegateRegistry;
+
+ public DefaultSyncPolicy(ISyncPolicyDelegate.Registry delegateRegistry) {
+ super();
+
+ this.delegateRegistry = delegateRegistry;
+ }
+
+ @Override
+ public <M, T> boolean shouldSynchronize(SyncItem<M, T> from, SyncItem<M, T> to, SyncFeature<M, T, ?> feature) {
+ ISyncPolicyDelegate<M, T> delegate = delegateRegistry.get(feature);
+
+ return (delegate == null) || delegate.shouldSynchronize(from, to);
+ }
+
+ @Override
+ public <M, T> Iterable<? extends SyncItem<M, T>> filter(final SyncItem<M, T> from, Iterable<? extends SyncItem<M, T>> to, SyncFeature<M, T, ?> feature) {
+ final ISyncPolicyDelegate<M, T> delegate = delegateRegistry.get(feature);
+
+ return (delegate == null)
+ ? to
+ : Iterables.filter(to, new Predicate<SyncItem<M, T>>() {
+ @Override
+ public boolean apply(SyncItem<M, T> input) {
+ return delegate.shouldSynchronize(from, input);
+ }
+ });
+ }
+
+ @Override
+ public <M, T, X> Iterable<? extends SyncFeature<M, T, X>> filter(final SyncItem<M, T> from, final SyncItem<M, T> to, Iterable<? extends SyncFeature<M, T, X>> features) {
+ return Iterables.filter(features, new Predicate<SyncFeature<M, T, X>>() {
+ @Override
+ public boolean apply(SyncFeature<M, T, X> input) {
+ return shouldSynchronize(from, to, input);
+ }
+ });
+ }
+
+ @Override
+ public <M, T> void observe(SyncItem<M, T> syncTarget, SyncFeature<M, T, ?> feature) {
+ final ISyncPolicyDelegate<M, T> delegate = delegateRegistry.get(feature);
+
+ // If there is no delegate, then there's no need to observe for changes in
+ // synchronizability because it can only ever be synchronized
+ if (delegate != null) {
+ delegate.observe(syncTarget);
+ }
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/ISyncPolicy.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/ISyncPolicy.java
new file mode 100644
index 00000000000..d74e8a3c42a
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/ISyncPolicy.java
@@ -0,0 +1,73 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.policy;
+
+import org.eclipse.papyrus.infra.sync.SyncFeature;
+import org.eclipse.papyrus.infra.sync.SyncItem;
+
+/**
+ * A policy for determining which {@link SyncFeature features} of which {@linkplain SyncItem items}
+ * should be synchronized.
+ */
+public interface ISyncPolicy {
+ /**
+ * Queries whether the specified synchronization target should have the given {@code feature} synchronized.
+ *
+ * @param from
+ * the source of synchronization
+ * @param to
+ * the target of synchronization
+ * @param feature
+ * the feature to be synchronized (or not, depending on the result)
+ * @return whether this {@code feature} should be synchronize {@code from} the source {@code to} the target
+ */
+ <M, T> boolean shouldSynchronize(SyncItem<M, T> from, SyncItem<M, T> to, SyncFeature<M, T, ?> feature);
+
+ /**
+ * Filters a one-to-many synchronization of the given {@code feature}.
+ *
+ * @param from
+ * the source of synchronization
+ * @param to
+ * the targets of synchronization
+ * @param feature
+ * the feature to be synchronized
+ * @return a filtered view of the synchronization targets that should have this {@code feature} synchronized
+ */
+ <M, T> Iterable<? extends SyncItem<M, T>> filter(SyncItem<M, T> from, Iterable<? extends SyncItem<M, T>> to, SyncFeature<M, T, ?> feature);
+
+ /**
+ * Filters a one-to-one synchronization of the given {@code features}.
+ *
+ * @param from
+ * the source of synchronization
+ * @param to
+ * the target of synchronization
+ * @param features
+ * the features to be synchronized
+ * @return a filtered view of the {@code features} that should be synchronized for this target
+ */
+ <M, T, X> Iterable<? extends SyncFeature<M, T, X>> filter(SyncItem<M, T> from, SyncItem<M, T> to, Iterable<? extends SyncFeature<M, T, X>> features);
+
+ /**
+ * Observe changes in the given {@code feature} of the target of synchronization to detect potential independent
+ * changes that imply that it should no longer be synchronized from other sources.
+ *
+ * @param syncTarget
+ * the target in a synchronization relationship
+ * @param feature
+ * a synchronizable feature that is to be observed
+ */
+ <M, T> void observe(SyncItem<M, T> syncTarget, SyncFeature<M, T, ?> feature);
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/ISyncPolicyDelegate.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/ISyncPolicyDelegate.java
new file mode 100644
index 00000000000..c2c3605bd20
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/ISyncPolicyDelegate.java
@@ -0,0 +1,105 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.policy;
+
+import org.eclipse.papyrus.infra.sync.SyncFeature;
+import org.eclipse.papyrus.infra.sync.SyncItem;
+
+/**
+ * A delegate {@linkplain SyncFeature feature}-specific {@linkplain ISyncPolicy synchronization policy} queries.
+ *
+ * @see SyncFeature
+ * @see ISyncPolicy#shouldSynchronize(SyncItem, SyncItem, SyncFeature)
+ */
+public interface ISyncPolicyDelegate<M, T> {
+
+ /**
+ * Queries whether the feature that I handle should be synchronized {@code to} the given target item
+ * {@code from} a source item.
+ *
+ * @param from
+ * the source of a synchronization request
+ * @param to
+ * the target of a synchronization request
+ *
+ * @return whether the synchronization of my feature is permitted under my policy rules
+ */
+ boolean shouldSynchronize(SyncItem<M, T> from, SyncItem<M, T> to);
+
+ /**
+ * Initiates observation of the specified synchronization item for changes in the feature that I govern,
+ * so that I may (according to my policy rules) detect conditions that override synchronization and which
+ * I may need to record somehow to cement that policy decision.
+ *
+ * @param syncTarget
+ * a target item in a synchronization relationship
+ *
+ * @see #unobserve(SyncItem)
+ */
+ void observe(SyncItem<M, T> syncTarget);
+
+ /**
+ * Ceases observation of the specified synchronization item .
+ *
+ * @param syncTarget
+ * a target item in a synchronization relationship
+ *
+ * @see #observe(SyncItem)
+ */
+ void unobserve(SyncItem<M, T> syncTarget);
+
+ //
+ // Nested types
+ //
+
+ /**
+ * A registry of synchronization policy delegates by synchronization feature type.
+ */
+ interface Registry {
+ /**
+ * Obtains the sync policy delegate for a {@code feature}, if any is registered.
+ *
+ * @param syncFeature
+ * a sync feature
+ * @return its delegate, or {@code null} if none is registered
+ */
+ <M, T> ISyncPolicyDelegate<M, T> get(SyncFeature<M, T, ?> syncFeature);
+
+ /**
+ * Registers a policy delegate for a sync feature type.
+ *
+ * @param policyDelegate
+ * the sync policy delegate
+ * @param featureType
+ * the kind of feature
+ *
+ * @throws ClassCastException
+ * if the {@code featureType} is not a subclass of {@link SyncFeature}
+ */
+ void register(ISyncPolicyDelegate<?, ?> policyDelegate, Class<?> featureType);
+
+ /**
+ * Deregisters a policy delegate that was applied to a sync feature type. Has no effect if this particular delegate was not the one registered for the feature.
+ *
+ * @param policyDelegate
+ * the sync policy delegate
+ * @param featureType
+ * the kind of feature
+ *
+ * @throws ClassCastException
+ * if the {@code featureType} is not a subclass of {@link SyncFeature}
+ */
+ void deregister(ISyncPolicyDelegate<?, ?> policyDelegate, Class<?> featureType);
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/SyncPolicyDelegate.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/SyncPolicyDelegate.java
new file mode 100644
index 00000000000..2f41f7501f1
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/policy/SyncPolicyDelegate.java
@@ -0,0 +1,77 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.policy;
+
+import org.eclipse.papyrus.infra.sync.EMFDispatch;
+import org.eclipse.papyrus.infra.sync.EMFDispatchManager;
+import org.eclipse.papyrus.infra.sync.EMFListener;
+import org.eclipse.papyrus.infra.sync.SyncFeature;
+import org.eclipse.papyrus.infra.sync.SyncItem;
+import org.eclipse.papyrus.infra.sync.internal.SyncService;
+
+/**
+ * Default (partial) implementation of the synchronization policy delegate interface.
+ */
+public abstract class SyncPolicyDelegate<M, T> implements ISyncPolicyDelegate<M, T> {
+
+ private EMFDispatchManager<EMFDispatch> dispatchManager;
+
+ public SyncPolicyDelegate() {
+ super();
+ }
+
+ /**
+ * Registers me as the synchronization policy delegate for the specified feature type in the synchronization service.
+ *
+ * @param syncFeatureType
+ * the kind of feature
+ *
+ * @throws ClassCastException
+ * if the {@code featureType} is not a subclass of {@link SyncFeature}
+ */
+ public void register(Class<?> syncFeatureType) {
+ EMFListener listener = SyncService.getCurrent().register(this, syncFeatureType);
+ dispatchManager = EMFDispatchManager.createSingle(listener);
+ }
+
+ /**
+ * De-registers me as the former synchronization policy delegate for the specified feature type in the synchronization service.
+ *
+ * @param syncFeatureType
+ * the kind of feature
+ *
+ * @throws ClassCastException
+ * if the {@code featureType} is not a subclass of {@link SyncFeature}
+ */
+ public void deregister(Class<?> syncFeatureType) {
+ if (dispatchManager != null) {
+ dispatchManager.removeAll();
+ dispatchManager = null;
+ }
+
+ SyncService.getCurrent().deregister(this, syncFeatureType);
+ }
+
+ @Override
+ public void observe(SyncItem<M, T> syncTarget) {
+ dispatchManager.add(syncTarget, createDispatcher(syncTarget));
+ }
+
+ @Override
+ public void unobserve(SyncItem<M, T> syncTarget) {
+ dispatchManager.remove(syncTarget);
+ }
+
+ protected abstract EMFDispatch createDispatcher(SyncItem<M, T> syncTarget);
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/AbstractSyncTrigger.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/AbstractSyncTrigger.java
new file mode 100644
index 00000000000..804dff8e2eb
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/AbstractSyncTrigger.java
@@ -0,0 +1,33 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.service;
+
+/**
+ * The base class of {@link ISyncTrigger}s that are registered on the extension point with XML enablement expressions.
+ */
+public abstract class AbstractSyncTrigger implements ISyncTrigger {
+
+ public AbstractSyncTrigger() {
+ super();
+ }
+
+ /**
+ * Just returns {@code true} because enablement is actually computed by the XML expression on the extension point.
+ */
+ @Override
+ public boolean isTriggeredOn(Object object) {
+ return true;
+ }
+
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/CascadeTriggers.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/CascadeTriggers.java
new file mode 100644
index 00000000000..5a9da663c30
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/CascadeTriggers.java
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.service;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.papyrus.infra.sync.Activator;
+import org.eclipse.papyrus.infra.sync.internal.SyncService;
+
+import com.google.common.base.Function;
+
+/**
+ * A sync action that cascades the evaluation of triggers to related objects.
+ */
+public class CascadeTriggers implements ISyncAction {
+
+ private final ISyncService service = SyncService.getCurrent();
+
+ private Function<Object, ? extends Iterable<?>> cascadeFunction;
+
+ public CascadeTriggers() {
+ this(null);
+ }
+
+ /**
+ * Initializes me with a cascade function.
+ */
+ public CascadeTriggers(Function<Object, ? extends Iterable<?>> cascadeFunction) {
+ super();
+
+ this.cascadeFunction = cascadeFunction;
+ }
+
+ /**
+ * Assigns a function that I use to compute the objects to which to cascade the
+ * evaluation of synchronization triggers.
+ */
+ public void setCascadeFunction(Function<Object, ? extends Iterable<?>> cascadeFunction) {
+ this.cascadeFunction = cascadeFunction;
+ }
+
+ /**
+ * Evaluates sync triggers on the objects related to the given triggered {@code object} by my
+ * {@linkplain #setCascadeFunction(Function) cascade function}.
+ */
+ @Override
+ public IStatus perform(ISyncService syncService, Object object) {
+ IStatus result = Status.OK_STATUS;
+
+ for (Object next : cascade(object)) {
+ IStatus nextResult = service.evaluateTriggers(next);
+ if ((nextResult != null) && !nextResult.isOK()) {
+ if (result.isOK()) {
+ result = nextResult;
+ } else if (result.isMultiStatus()) {
+ ((MultiStatus) result).merge(nextResult);
+ } else {
+ result = new MultiStatus(Activator.PLUGIN_ID, 0, new IStatus[] { result, nextResult }, "Multiple sync trigger cascade problems occurred.", null);
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Obtains the objects on which to evaluate cascaded sync triggers, based on the given {@code triggered} object.
+ *
+ * @throws IllegalStateException
+ * if I have no {@linkplain #setCascadeFunction(Function) cascade function} with which
+ * to compute the cascaded triggers
+ */
+ protected Iterable<?> cascade(Object triggered) {
+ if (cascadeFunction == null) {
+ throw new IllegalStateException("no cascade function"); //$NON-NLS-1$
+ }
+
+ return cascadeFunction.apply(triggered);
+ }
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncAction.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncAction.java
new file mode 100644
index 00000000000..c4c708bb950
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncAction.java
@@ -0,0 +1,24 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.service;
+
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * An action performed on occurrence of a {@linkplain ISyncTrigger synchronization trigger} to configure/modify the synchronization
+ * behaviour of some object.
+ */
+public interface ISyncAction {
+ IStatus perform(ISyncService syncService, Object object);
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncService.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncService.java
new file mode 100644
index 00000000000..1a77cc4a86c
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncService.java
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.service;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.papyrus.infra.core.services.IService;
+import org.eclipse.papyrus.infra.sync.EMFDispatch;
+import org.eclipse.papyrus.infra.sync.EMFDispatchManager;
+import org.eclipse.papyrus.infra.sync.ISyncObject;
+import org.eclipse.papyrus.infra.sync.policy.ISyncPolicy;
+
+/**
+ * A Papyrus Service providing EMF dispatch managers, synchronization registries, and other synchronization facilities.
+ */
+public interface ISyncService extends ISyncObject, IService {
+ <D extends EMFDispatch> EMFDispatchManager<D> createSingleDispatchManager();
+
+ <D extends EMFDispatch> EMFDispatchManager<D> createMultipleDispatchManager();
+
+ IStatus evaluateTriggers(Object object);
+
+ /**
+ * Obtains the sync service's current synchronization policy.
+ *
+ * @return the synchronization policy. Never {@code null}
+ */
+ ISyncPolicy getSyncPolicy();
+
+ /**
+ * Sets the effective synchronization policy for the sync service.
+ *
+ * @param syncPolicy
+ * the new sync policy, or {@code null} to install a non-policy (meaning that everything is always synchronized)
+ */
+ void setSyncPolicy(ISyncPolicy syncPolicy);
+
+ /**
+ * Obtains the executor service on which to schedule asynchronous {@link SyncServiceRunnable}s.
+ *
+ * @return the asynchronous execution service; never {@code null}
+ *
+ * @see #setAsyncExecutor(Executor)
+ */
+ Executor getAsyncExecutor();
+
+ /**
+ * Sets the executor service on which to schedule asynchronous {@link SyncServiceRunnable}s.
+ * If different from the {@linkplain #getAsyncExecutor() current executor}, the current executor will be
+ * {@linkplain ExecutorService#shutdown() shut down} if it is an {@link ExecutorService}.
+ *
+ * @param executor
+ * the asynchronous execution service; must not be {@code null}
+ *
+ * @see #getAsyncExecutor()
+ */
+ void setAsyncExecutor(Executor executor);
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncTrigger.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncTrigger.java
new file mode 100644
index 00000000000..8a563eccaec
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/ISyncTrigger.java
@@ -0,0 +1,27 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.service;
+
+/**
+ * A description of conditions for triggering some synchronization action on some object.
+ * Synchronization triggers are evaluated by the system initially on the root object of
+ * a model. Cascading evaluation of triggers, if necessary, is the responsibility of
+ * trigger extensions.
+ */
+public interface ISyncTrigger {
+
+ boolean isTriggeredOn(Object object);
+
+ ISyncAction trigger(ISyncService syncService, Object object);
+}
diff --git a/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/SyncServiceRunnable.java b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/SyncServiceRunnable.java
new file mode 100644
index 00000000000..2b8a893930e
--- /dev/null
+++ b/plugins/infra/misc/org.eclipse.papyrus.infra.sync/src/org/eclipse/papyrus/infra/sync/service/SyncServiceRunnable.java
@@ -0,0 +1,93 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.sync.service;
+
+import java.lang.reflect.UndeclaredThrowableException;
+import java.util.concurrent.Callable;
+
+import org.eclipse.papyrus.infra.sync.ISyncObject;
+
+import com.google.common.reflect.TypeToken;
+import com.google.common.util.concurrent.AbstractCheckedFuture;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListenableFutureTask;
+
+/**
+ * An operation that runs in the context of the {@link ISyncService synchronization service}.
+ * The {@link SyncServiceRunnable.Safe Safe} variant does not throw a checked exception.
+ *
+ * @see ISyncService#run(SyncServiceRunnable)
+ * @see SyncServiceRunnable.Safe
+ */
+public abstract class SyncServiceRunnable<V, X extends Exception> {
+
+ @SuppressWarnings("serial")
+ private final TypeToken<X> exceptionType = new TypeToken<X>(getClass()) {
+ };
+
+ public abstract V run(ISyncService syncService) throws X;
+
+ @SuppressWarnings("unchecked")
+ public final Class<X> getExceptionType() {
+ return (Class<X>) exceptionType.getRawType();
+ }
+
+ /**
+ * Obtains me as a {@link Runnable} checked future result in the context of a sync object.
+ *
+ * @param context
+ * the synchronization context in which context I shall run
+ *
+ * @return a checked future result that implements that {@link Runnable} API for execution
+ */
+ public CheckedFuture<V, X> asFuture(final ISyncObject context) {
+ return checked(ListenableFutureTask.create(new Callable<V>() {
+ @Override
+ public V call() throws Exception {
+ return context.run(SyncServiceRunnable.this);
+ }
+ }));
+ }
+
+ private CheckedFuture<V, X> checked(final ListenableFuture<V> future) {
+ class Checked extends AbstractCheckedFuture<V, X>implements Runnable {
+ Checked() {
+ super(future);
+ }
+
+ @Override
+ public void run() {
+ ((Runnable) future).run();
+ }
+
+ @Override
+ protected X mapException(Exception e) {
+ if (getExceptionType().isInstance(e)) {
+ return getExceptionType().cast(e);
+ } else {
+ throw new UndeclaredThrowableException(e);
+ }
+ }
+ }
+ ;
+
+ return new Checked();
+ }
+
+ public static abstract class Safe<V> extends SyncServiceRunnable<V, RuntimeException> {
+ @Override
+ public abstract V run(ISyncService syncService);
+ }
+}
diff --git a/plugins/infra/misc/pom.xml b/plugins/infra/misc/pom.xml
new file mode 100644
index 00000000000..70e45113a66
--- /dev/null
+++ b/plugins/infra/misc/pom.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>org.eclipse.papyrus.infra-misc</artifactId>
+ <packaging>pom</packaging>
+ <parent>
+ <groupId>org.eclipse.papyrus</groupId>
+ <artifactId>org.eclipse.papyrus.infra</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+ <name>Papyrus Infra Other Bundles</name>
+ <description>Various uncategorized bundles providing common APIs.</description>
+
+ <modules>
+ <module>org.eclipse.papyrus.infra.hyperlink</module>
+ <module>org.eclipse.papyrus.infra.psf</module>
+ <module>org.eclipse.papyrus.infra.sync</module>
+ </modules>
+</project>

Back to the top