/* * Copyright (c) 2006, 2010 Borland Software 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: * Michael Golubev (Borland) - initial API and implementation * Artem Tikhomirov (Borland) - maintenance and extra configuration */ package org.eclipse.gmf.internal.codegen.util; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage; import org.eclipse.gmf.codegen.gmfgen.GenCustomGeneratorExtension; import org.eclipse.gmf.codegen.gmfgen.GenStandardPreferencePage; import org.eclipse.gmf.internal.common.reconcile.Cleaner; import org.eclipse.gmf.internal.common.reconcile.Copier; import org.eclipse.gmf.internal.common.reconcile.Decision; import org.eclipse.gmf.internal.common.reconcile.DefaultDecision; import org.eclipse.gmf.internal.common.reconcile.Matcher; import org.eclipse.gmf.internal.common.reconcile.MergeListsDecision; import org.eclipse.gmf.internal.common.reconcile.Reconciler; import org.eclipse.gmf.internal.common.reconcile.ReconcilerConfigBase; import org.eclipse.gmf.internal.common.reconcile.ReflectiveMatcher; import org.eclipse.gmf.internal.common.reconcile.StringPatternDecision; public class GMFGenConfig extends ReconcilerConfigBase { public GMFGenConfig() { final GMFGenPackage GMFGEN = GMFGenPackage.eINSTANCE; setMatcher(GMFGEN.getGenEditorGenerator(), ALWAYS_MATCH); preserveIfSet(GMFGEN.getGenEditorGenerator_CopyrightText()); preserveIfSet(GMFGEN.getGenEditorGenerator_PackageNamePrefix()); preserveIfSet(GMFGEN.getGenEditorGenerator_DomainFileExtension()); preserveIfSet(GMFGEN.getGenEditorGenerator_DiagramFileExtension()); preserveIfSet(GMFGEN.getGenEditorGenerator_SameFileForDiagramAndModel()); preserveIfSet(GMFGEN.getGenEditorGenerator_ModelID()); preserveIfSet(GMFGEN.getGenEditorGenerator_DynamicTemplates()); preserveIfSet(GMFGEN.getGenEditorGenerator_TemplateDirectory()); preserveIfSet(GMFGEN.getGenEditorGenerator_PluginDirectory()); setMatcher(GMFGEN.getGenPlugin(), ALWAYS_MATCH); // exactly one feature for ALWAYS_MATCH GenEditorGenerator preserveIfSet(GMFGEN.getGenPlugin_ID()); preserveIfSet(GMFGEN.getGenPlugin_Name()); preserveIfSet(GMFGEN.getGenPlugin_Provider()); preserveIfSet(GMFGEN.getGenPlugin_Version()); preserveIfSet(GMFGEN.getGenPlugin_ActivatorClassName()); preserveIfSet(GMFGEN.getGenPlugin_PrintingEnabled()); addDecision(GMFGEN.getGenPlugin(), new MergeListsDecision(GMFGEN.getGenPlugin_RequiredPlugins())); setMatcher(GMFGEN.getGenEditorView(), ALWAYS_MATCH); //exactly one preserveIfSet(GMFGEN.getGenEditorView_IconPath()); preserveIfSet(GMFGEN.getGenEditorView_ClassName()); preserveIfSet(GMFGEN.getGenEditorView_ID()); setMatcher(GMFGEN.getGenDiagram(), ALWAYS_MATCH); restoreOld(GMFGEN.getGenDiagram(), GMFGEN.getGenCommonBase_EditPartClassName()); restoreOld(GMFGEN.getGenDiagram(), GMFGEN.getGenCommonBase_ItemSemanticEditPolicyClassName()); restoreOld(GMFGEN.getGenDiagram(), GMFGEN.getGenContainerBase_CanonicalEditPolicyClassName()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getGenDiagram_Synchronized()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getMeasurementUnit_Units()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getShortcuts_ContainsShortcutsTo()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getShortcuts_ShortcutsProvidedFor()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getEditorCandies_CreationWizardIconPath()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getEditorCandies_CreationWizardCategoryID()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getEditorCandies_EditingDomainID()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getBatchValidation_ValidationEnabled()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getBatchValidation_LiveValidationUIFeedback()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getBatchValidation_ValidationDecorators()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getBatchValidation_ValidationDecoratorProviderClassName()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getBatchValidation_ValidationDecoratorProviderPriority()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getBatchValidation_ValidationProviderClassName()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getBatchValidation_ValidationProviderPriority()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getBatchValidation_MetricProviderPriority()); preserveIfSet(GMFGEN.getGenDiagram(), GMFGEN.getBatchValidation_MetricProviderClassName()); for (EClass node : new EClass[] { GMFGEN.getGenTopLevelNode(), GMFGEN.getGenChildNode(), GMFGEN.getGenChildLabelNode(), GMFGEN.getGenChildSideAffixedNode() }) { setMatcher(node, new VisualIDMatcher()); preserveIfSet(node, GMFGEN.getGenCommonBase_NotationViewFactoryClassName()); restoreOld(node, GMFGEN.getGenCommonBase_EditPartClassName()); restoreOld(node, GMFGEN.getGenCommonBase_ItemSemanticEditPolicyClassName()); restoreOld(node, GMFGEN.getGenContainerBase_CanonicalEditPolicyClassName()); restoreOld(node, GMFGEN.getGenNode_PrimaryDragEditPolicyQualifiedClassName()); restoreOld(node, GMFGEN.getGenNode_GraphicalNodeEditPolicyClassName()); restoreOld(node, GMFGEN.getGenNode_CreateCommandClassName()); } setMatcher(GMFGEN.getGenCompartment(), new VisualIDMatcher()); preserveIfSet(GMFGEN.getGenCompartment(), GMFGEN.getGenCommonBase_NotationViewFactoryClassName()); restoreOld(GMFGEN.getGenCompartment(), GMFGEN.getGenCommonBase_EditPartClassName()); restoreOld(GMFGEN.getGenCompartment(), GMFGEN.getGenCommonBase_ItemSemanticEditPolicyClassName()); restoreOld(GMFGEN.getGenCompartment(), GMFGEN.getGenContainerBase_CanonicalEditPolicyClassName()); restoreOld(GMFGEN.getGenCompartment_ListLayout()); preserveIfSet(GMFGEN.getGenCompartment_CanCollapse()); preserveIfSet(GMFGEN.getGenCompartment_HideIfEmpty()); preserveIfSet(GMFGEN.getGenCompartment_NeedsTitle()); setMatcher(GMFGEN.getGenLink(), new VisualIDMatcher()); preserveIfSet(GMFGEN.getGenLink(), GMFGEN.getGenCommonBase_NotationViewFactoryClassName()); restoreOld(GMFGEN.getGenLink(), GMFGEN.getGenCommonBase_EditPartClassName()); restoreOld(GMFGEN.getGenLink(), GMFGEN.getGenCommonBase_ItemSemanticEditPolicyClassName()); restoreOld(GMFGEN.getGenLink_CreateCommandClassName()); restoreOld(GMFGEN.getGenLink_ReorientCommandClassName()); preserveIfSet(GMFGEN.getGenLink_IncomingCreationAllowed()); preserveIfSet(GMFGEN.getGenLink_OutgoingCreationAllowed()); preserveIfSet(GMFGEN.getGenLink_ViewDirectionAlignedWithModel()); preserveIfSet(GMFGEN.getGenLink_TreeBranch()); for (EClass label : new EClass[] { GMFGEN.getGenLinkLabel(), GMFGEN.getGenNodeLabel(), GMFGEN.getGenExternalNodeLabel() }) { setMatcher(label, new VisualIDMatcher()); preserveIfSet(label, GMFGEN.getGenCommonBase_NotationViewFactoryClassName()); restoreOld(label, GMFGEN.getGenCommonBase_EditPartClassName()); restoreOld(label, GMFGEN.getGenCommonBase_ItemSemanticEditPolicyClassName()); } //if parent node is matched, then viemap is matched automatically because it is [1] feature. //there are nothing to reconcile for viewmaps, all their properties are derived //we need this only to dig into viewmap attributes setMatcherForAllSubclasses(GMFGEN.getViewmap(), ALWAYS_MATCH); setMatcher(GMFGEN.getDefaultSizeAttributes(), ALWAYS_MATCH); setCopier(GMFGEN.getDefaultSizeAttributes(), Copier.COMPLETE_COPY_NO_CROSSREF); preserveIfSet(GMFGEN.getDefaultSizeAttributes_Height()); preserveIfSet(GMFGEN.getDefaultSizeAttributes_Width()); setMatcherForAllSubclasses(GMFGEN.getAttributes(), ALWAYS_MATCH); setCopierForAllSubclasses(GMFGEN.getAttributes(), Copier.COMPLETE_COPY_NO_CROSSREF); // provided GenCommonBase matched, custom behaviour should be kept as is setMatcher(GMFGEN.getCustomBehaviour(), ALWAYS_MATCH); setCopier(GMFGEN.getCustomBehaviour(), Copier.COMPLETE_COPY_NO_CROSSREF); // We assume there's only one OpenDiagramBehaviour per GenCommonBase, hence do not attempt to match anything but metaclass setMatcher(GMFGEN.getOpenDiagramBehaviour(), ALWAYS_MATCH); class KeepOldIfNewIsByPatternOrNotSet extends StringPatternDecision { KeepOldIfNewIsByPatternOrNotSet(EAttribute feature, String pattern) { super(pattern, feature); } @Override public void apply(EObject current, EObject old) { String newValue = (String) current.eGet(getFeature()); if (isValueSet(old) && (newValue == null || myPattern.matcher(newValue).matches())) { preserveOld(current, old); } else { acceptNew(current, old); } } } // XXX not sure whether to keep old value on newValue == null is right, as null value is perfectly // legal and sensible (meaning this very diagram). Keeping old for now because it seems easier to reset // value to null rather than to type once again. addDecision(GMFGEN.getOpenDiagramBehaviour(), new KeepOldIfNewIsByPatternOrNotSet(GMFGEN.getOpenDiagramBehaviour_DiagramKind(), "^FIXME.*")); //$NON-NLS-1$ addDecision(GMFGEN.getOpenDiagramBehaviour(), new KeepOldIfNewIsByPatternOrNotSet(GMFGEN.getOpenDiagramBehaviour_EditorID(), "^FIXME.*")); //$NON-NLS-1$ preserveIfSet(GMFGEN.getOpenDiagramBehaviour_EditPolicyClassName()); preserveIfSet(GMFGEN.getOpenDiagramBehaviour_OpenAsEclipseEditor()); // if there's a need to keep manually written openDiagramBehavior, uncomment next line // for Reconciler#handleNotMatchedOld to perform a copy // setCopier(GMFGEN.getOpenDiagramBehaviour(), Copier.COMPLETE_COPY); setMatcher(GMFGEN.getMetamodelType(), ALWAYS_MATCH); restoreOld(GMFGEN.getMetamodelType_EditHelperClassName()); preserveIfSet(GMFGEN.getMetamodelType(), GMFGEN.getElementType_DisplayName()); preserveIfSet(GMFGEN.getMetamodelType(), GMFGEN.getElementType_DefinedExternally()); setMatcher(GMFGEN.getSpecializationType(), ALWAYS_MATCH); restoreOld(GMFGEN.getSpecializationType_EditHelperAdviceClassName()); preserveIfSet(GMFGEN.getSpecializationType(), GMFGEN.getElementType_DisplayName()); preserveIfSet(GMFGEN.getSpecializationType(), GMFGEN.getElementType_DefinedExternally()); setMatcher(GMFGEN.getGenPropertySheet(), ALWAYS_MATCH); preserveIfSet(GMFGEN.getGenPropertySheet_ReadOnly()); preserveIfSet(GMFGEN.getGenPropertySheet_NeedsCaption()); preserveIfSet(GMFGEN.getGenPropertySheet_PackageName()); preserveIfSet(GMFGEN.getGenPropertySheet_LabelProviderClassName()); setMatcherForAllSubclasses(GMFGEN.getGenPropertyTab(), new ReflectiveMatcher(GMFGEN.getGenPropertyTab_ID())); preserveIfSet(GMFGEN.getGenStandardPropertyTab(), GMFGEN.getGenPropertyTab_Label()); addDecision(GMFGEN.getGenCustomPropertyTab(), new KeepOldIfNewIsByPatternOrNotSet(GMFGEN.getGenPropertyTab_Label(), "^Core$")); //$NON-NLS-1$ preserveIfSet(GMFGEN.getGenCustomPropertyTab_ClassName()); setCopier(GMFGEN.getGenCustomPropertyTab(), Copier.COMPLETE_COPY_NO_CROSSREF); setMatcher(GMFGEN.getGenNavigator(), ALWAYS_MATCH); preserveIfRemoved(GMFGEN.getGenEditorGenerator(), GMFGEN.getGenEditorGenerator_Navigator()); preserveIfSet(GMFGEN.getGenNavigator(), GMFGEN.getGenDomainModelNavigator_GenerateDomainModelNavigator()); preserveIfSet(GMFGEN.getGenNavigator(), GMFGEN.getGenDomainModelNavigator_DomainContentExtensionID()); preserveIfSet(GMFGEN.getGenNavigator(), GMFGEN.getGenDomainModelNavigator_DomainContentExtensionName()); preserveIfSet(GMFGEN.getGenNavigator(), GMFGEN.getGenDomainModelNavigator_DomainContentExtensionPriority()); preserveIfSet(GMFGEN.getGenNavigator(), GMFGEN.getGenDomainModelNavigator_DomainContentProviderClassName()); preserveIfSet(GMFGEN.getGenNavigator(), GMFGEN.getGenDomainModelNavigator_DomainLabelProviderClassName()); preserveIfSet(GMFGEN.getGenNavigator(), GMFGEN.getGenDomainModelNavigator_DomainModelElementTesterClassName()); preserveIfSet(GMFGEN.getGenNavigator(), GMFGEN.getGenDomainModelNavigator_DomainNavigatorItemClassName()); preserveIfSet(GMFGEN.getGenNavigator_ContentExtensionID()); preserveIfSet(GMFGEN.getGenNavigator_ContentExtensionName()); preserveIfSet(GMFGEN.getGenNavigator_ContentExtensionPriority()); preserveIfSet(GMFGEN.getGenNavigator_LinkHelperExtensionID()); preserveIfSet(GMFGEN.getGenNavigator_SorterExtensionID()); preserveIfSet(GMFGEN.getGenNavigator_ActionProviderID()); preserveIfSet(GMFGEN.getGenNavigator_ContentProviderClassName()); preserveIfSet(GMFGEN.getGenNavigator_LabelProviderClassName()); preserveIfSet(GMFGEN.getGenNavigator_LinkHelperClassName()); preserveIfSet(GMFGEN.getGenNavigator_SorterClassName()); preserveIfSet(GMFGEN.getGenNavigator_ActionProviderClassName()); preserveIfSet(GMFGEN.getGenNavigator_AbstractNavigatorItemClassName()); preserveIfSet(GMFGEN.getGenNavigator_NavigatorGroupClassName()); preserveIfSet(GMFGEN.getGenNavigator_NavigatorItemClassName()); preserveIfSet(GMFGEN.getGenNavigator_UriInputTesterClassName()); preserveIfSet(GMFGEN.getGenNavigator_PackageName()); setMatcher(GMFGEN.getGenDiagramPreferences(), ALWAYS_MATCH); setCopier(GMFGEN.getGenDiagramPreferences(), Copier.COMPLETE_COPY_NO_CROSSREF); setMatcher(GMFGEN.getGenApplication(), ALWAYS_MATCH); preserveIfSet(GMFGEN.getGenApplication_ID()); preserveIfSet(GMFGEN.getGenApplication_Title()); preserveIfSet(GMFGEN.getGenApplication_PackageName()); preserveIfSet(GMFGEN.getGenApplication_ClassName()); preserveIfSet(GMFGEN.getGenApplication_PerspectiveId()); preserveIfSet(GMFGEN.getGenApplication_SupportFiles()); // // XXX ReflectiveMatcher(Kind) instead? setMatcher(GMFGEN.getGenStandardPreferencePage(), new Matcher() { public boolean match(EObject current, EObject old) { assert current instanceof GenStandardPreferencePage; assert old instanceof GenStandardPreferencePage; GenStandardPreferencePage curPage = (GenStandardPreferencePage) current; GenStandardPreferencePage oldPage = (GenStandardPreferencePage) old; if (curPage.getParent() == null) { //single root page, just match it with other root return oldPage.getParent() == null; } return curPage.getKind() == oldPage.getKind(); } }); restoreOld(GMFGEN.getGenStandardPreferencePage(), GMFGEN.getGenPreferencePage_ID()); restoreOld(GMFGEN.getGenStandardPreferencePage(), GMFGEN.getGenPreferencePage_Name()); setCleaner(GMFGEN.getGenStandardPreferencePage(), new Cleaner.Remove()); // Although copying old standard pages may seem odd here (i.e. if new model comes without some standard page, most likely this is // intentionally and we don't need to restore the old one), there are cases when copying old is necessary - i.e. user moved standard page // out of GenPreferencePage hierarchy (up to GenDiagram) and set #parentCategory explicitly. In latter case, we need to copy his changes. // I believe in former case user can just delete the page he no longer needs (and his DGMT no longer gives it to him) setCopier(GMFGEN.getGenStandardPreferencePage(), Copier.COMPLETE_COPY_NO_CROSSREF); setMatcher(GMFGEN.getGenCustomPreferencePage(), GMFGEN.getGenCustomPreferencePage_QualifiedClassName()); restoreOld(GMFGEN.getGenCustomPreferencePage_GenerateBoilerplate()); setCopier(GMFGEN.getGenCustomPreferencePage(), Copier.COMPLETE_COPY_NO_CROSSREF); // kepp parent category, if set, for both standard and custom pages preserveIfSet(GMFGEN.getGenStandardPreferencePage(), GMFGEN.getGenPreferencePage_ParentCategory()); preserveIfSet(GMFGEN.getGenCustomPreferencePage(), GMFGEN.getGenPreferencePage_ParentCategory()); // setMatcher(GMFGEN.getGenPreference(), GMFGEN.getGenPreference_Name()); // XXX or KEY, perhaps, if persistence format is more important? preserveIfSet(GMFGEN.getGenPreference_Key()); preserveIfSet(GMFGEN.getGenPreference_DefaultValue()); setCopier(GMFGEN.getGenPreference(), Copier.COMPLETE_COPY_NO_CROSSREF); // // preserve model access attributes, or completely copy old if none in the new model found. setMatcher(GMFGEN.getDynamicModelAccess(), ALWAYS_MATCH); preserveIfSet(GMFGEN.getDynamicModelAccess_ClassName()); preserveIfSet(GMFGEN.getDynamicModelAccess_PackageName()); setCopier(GMFGEN.getDynamicModelAccess(), Copier.COMPLETE_COPY_NO_CROSSREF); setMatcher(GMFGEN.getGenExpressionProviderContainer(), ALWAYS_MATCH); setMatcher(GMFGEN.getGenJavaExpressionProvider(), ALWAYS_MATCH); preserveIfSet(GMFGEN.getGenJavaExpressionProvider_InjectExpressionBody()); setMatcher(GMFGEN.getGenParsers(), ALWAYS_MATCH); preserveIfSet(GMFGEN.getGenParsers_ClassName()); preserveIfSet(GMFGEN.getGenParsers_PackageName()); preserveIfSet(GMFGEN.getGenParsers_ProviderPriority()); preserveIfSet(GMFGEN.getGenParsers_ExtensibleViaService()); // next three matchers are pure "record match and do nothing" matchers // we need them for CustomParser's copy to update crossreferences afterwards correctly // this approach, with only matcher and no further decisions, seems not bad, as GenLabel // references only single labelModelFacet, hence we could alsways assume they are matching. setMatcher(GMFGEN.getFeatureLabelModelFacet(), ALWAYS_MATCH); setMatcher(GMFGEN.getDesignLabelModelFacet(), ALWAYS_MATCH); setMatcher(GMFGEN.getLabelModelFacet(), ALWAYS_MATCH); setMatcher(GMFGEN.getCustomParser(), GMFGEN.getCustomParser_QualifiedName()); setCopier(GMFGEN.getCustomParser(), Copier.COMPLETE_COPY_WITH_CROSSREF); setMatcher(GMFGEN.getGenContextMenu(), new VisualIDMatcher(GMFGEN.getGenContextMenu_Context())); preserveIfSet(GMFGEN.getGenContextMenu(), GMFGEN.getGenContributionManager_ID()); setCopier(GMFGEN.getGenContextMenu(), Copier.COMPLETE_COPY_WITH_CROSSREF); setMatcher(GMFGEN.getGenCustomAction(), GMFGEN.getGenCustomAction_QualifiedClassName()); preserveIfSet(GMFGEN.getGenCustomAction_GenerateBoilerplate()); preserveIfSet(GMFGEN.getGenCustomAction_Name()); setCopier(GMFGEN.getGenCustomAction(), Copier.COMPLETE_COPY_NO_CROSSREF); setMatcher(GMFGEN.getGenCommandAction(), GMFGEN.getGenCommandAction_CommandIdentifier()); preserveIfSet(GMFGEN.getGenCommandAction_Name()); setCopier(GMFGEN.getGenCommandAction(), Copier.COMPLETE_COPY_NO_CROSSREF); // copy then, if none found setMatcher(GMFGEN.getGenSeparator(), GMFGEN.getGenSeparator_GroupName()); setMatcher(GMFGEN.getGenGroupMarker(), GMFGEN.getGenGroupMarker_GroupName()); setMatcher(GMFGEN.getCreateShortcutAction(), ALWAYS_MATCH); setMatcher(GMFGEN.getInitDiagramAction(), ALWAYS_MATCH); setMatcher(GMFGEN.getLoadResourceAction(), ALWAYS_MATCH); setCopier(GMFGEN.getCreateShortcutAction(), Copier.COMPLETE_COPY_NO_CROSSREF); setCopier(GMFGEN.getInitDiagramAction(), Copier.COMPLETE_COPY_NO_CROSSREF); setCopier(GMFGEN.getLoadResourceAction(), Copier.COMPLETE_COPY_NO_CROSSREF); preserveIfSet(GMFGEN.getCreateShortcutAction(), GMFGEN.getGenAction_Name()); preserveIfSet(GMFGEN.getCreateShortcutAction(), GMFGEN.getGenAction_QualifiedClassName()); preserveIfSet(GMFGEN.getInitDiagramAction(), GMFGEN.getGenAction_Name()); preserveIfSet(GMFGEN.getInitDiagramAction(), GMFGEN.getGenAction_QualifiedClassName()); preserveIfSet(GMFGEN.getLoadResourceAction(), GMFGEN.getGenAction_Name()); preserveIfSet(GMFGEN.getLoadResourceAction(), GMFGEN.getGenAction_QualifiedClassName()); setMatcher(GMFGEN.getGenCustomGeneratorExtension(), GMFGEN.getGenCustomGeneratorExtension_Name()); setCopier(GMFGEN.getGenCustomGeneratorExtension(), new Copier.WithCrossRefsCopier(){ @Override public EObject copyToCurrent(EObject currentParent, EObject old, Reconciler reconciler) { EObject result = null; if (old instanceof GenCustomGeneratorExtension){ GenCustomGeneratorExtension oldExtension = (GenCustomGeneratorExtension)old; if (!oldExtension.isFromCustomBridge()) { result = super.copyToCurrent(currentParent, old, reconciler); } } return result; } }); } private void restoreOld(EClass eClass, EAttribute feature) { addDecision(eClass, new Decision.ALWAYS_OLD(feature)); } private void restoreOld(EAttribute feature) { assert !feature.getEContainingClass().isAbstract(); restoreOld(feature.getEContainingClass(), feature); } // use this shorthand for features from concrete (non-abstract) classes private void preserveIfSet(EAttribute feature) { addDecision(feature.getEContainingClass(), new DefaultDecision(feature)); } //FIXME: only attributes for now, allow references private void preserveIfSet(EClass eClass, EAttribute feature) { // decisions are queried against specific types, hence need to make sure no abstract types get through assert !eClass.isAbstract(); addDecision(eClass, new DefaultDecision(feature)); } private void preserveIfRemoved(EClass eClass, EStructuralFeature feature) { addDecision(eClass, new DefaultDecision(feature, true)); } }