/* * Copyright (c) 2007, 2009 Borland Software Corporation * * 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: Borland - initial API and implementation */ package org.eclipse.gmf.internal.codegen.util; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage; import org.eclipse.gmf.internal.common.migrate.MigrationDelegateImpl; /** * Migration from old, 2005-styled GMF models to instances of dynamic 2006 model * (should be updated further to normal 2008 using CustomCopier) */ class MigrationDelegate extends MigrationDelegateImpl { private EReference myGenAuditContainer_ChildContainers; private EReference myGenAuditRoot_Audits; private EAttribute myGenAuditRoot_Id; private EAttribute myGenAuditRoot_Name; private EAttribute myGenAuditRoot_Description; private EObject myRootContainer; private LinkedHashMap<EObject, Collection<String>> myRequiredPlugins; private EObject myProvidersContainer; MigrationDelegate() { } private EPackage gmfgen2006 = EPackage.Registry.INSTANCE.getEPackage(ModelVersions.GMFGEN_2_0); private EFactory factory2006 = gmfgen2006.getEFactoryInstance(); private GMFGenPackage gmfgenNew = GMFGenPackage.eINSTANCE; // any 2008 or later GMFGen as the only thing we use here are class/feature names, not EClasses/EStrFea private EClassifier class_editorCandies = gmfgen2006.getEClassifier(gmfgenNew.getEditorCandies().getName()); private EClassifier class_providerClassNames = gmfgen2006.getEClassifier(gmfgenNew.getProviderClassNames().getName()); private EClassifier class_editPartCandies = gmfgen2006.getEClassifier(gmfgenNew.getEditPartCandies().getName()); private EClassifier class_typeLinkModelFacet = gmfgen2006.getEClassifier(gmfgenNew.getTypeLinkModelFacet().getName()); private EClass class_genPlugin = (EClass) gmfgen2006.getEClassifier(gmfgenNew.getGenPlugin().getName()); private EClass class_genExpressionInterpreter = (EClass) gmfgen2006.getEClassifier(gmfgenNew.getGenExpressionInterpreter().getName()); private EClass class_featureLabelModelFacet = (EClass) gmfgen2006.getEClassifier(gmfgenNew.getFeatureLabelModelFacet().getName()); private EClass class_genAuditRule = (EClass) gmfgen2006.getEClassifier(gmfgenNew.getGenAuditRule().getName()); private EClass class_genAuditContainer = (EClass) gmfgen2006.getEClassifier(gmfgenNew.getGenAuditContainer().getName()); private EClass class_genAuditRoot = (EClass) gmfgen2006.getEClassifier(gmfgenNew.getGenAuditRoot().getName()); private EClass class_genFeatureValueSpec = (EClass) gmfgen2006.getEClassifier(gmfgenNew.getGenFeatureValueSpec().getName()); private EClass class_genExpressionProviderBase = (EClass) gmfgen2006.getEClassifier(gmfgenNew.getGenExpressionProviderBase().getName()); private EClass class_genExpressionProviderContainer = (EClass) gmfgen2006.getEClassifier(gmfgenNew.getGenExpressionProviderContainer().getName()); private EClass class_genEditorGenerator = (EClass) gmfgen2006.getEClassifier(gmfgenNew.getGenEditorGenerator().getName()); private EStructuralFeature feature_genExpressionProviderBase_container = class_genExpressionProviderBase.getEStructuralFeature(gmfgenNew.getGenExpressionProviderBase_Container().getName()); private EStructuralFeature feature_genExpressionProviderContainer_providers = class_genExpressionProviderContainer.getEStructuralFeature(gmfgenNew.getGenExpressionProviderContainer_Providers().getName()); private EStructuralFeature feature_genExpressionProviderContainer_editorGen = class_genExpressionProviderContainer.getEStructuralFeature(gmfgenNew.getGenExpressionProviderContainer_EditorGen().getName()); private EStructuralFeature feature_genEditorGenerator_expressionProviders = class_genEditorGenerator.getEStructuralFeature(gmfgenNew.getGenEditorGenerator_ExpressionProviders().getName()); private EStructuralFeature feature_genEditorGenerator_plugin = class_genEditorGenerator.getEStructuralFeature(gmfgenNew.getGenEditorGenerator_Plugin().getName()); private EStructuralFeature feature_genPlugin_requiredPlugins = class_genPlugin.getEStructuralFeature(gmfgenNew.getGenPlugin_RequiredPlugins().getName()); private EStructuralFeature feature_featureLabelModelFacet_metaFeatures = class_featureLabelModelFacet.getEStructuralFeature(gmfgenNew.getFeatureLabelModelFacet_MetaFeatures().getName()); private EStructuralFeature feature_genAuditContainer_path = class_genAuditContainer.getEStructuralFeature(gmfgenNew.getGenAuditContainer_Path().getName()); private EStructuralFeature feature_genAuditContainer_id = class_genAuditContainer.getEStructuralFeature(gmfgenNew.getGenAuditContainer_Id().getName()); private EStructuralFeature feature_genAuditContainer_name = class_genAuditContainer.getEStructuralFeature(gmfgenNew.getGenAuditContainer_Name().getName()); private EStructuralFeature feature_genAuditContainer_description = class_genAuditContainer.getEStructuralFeature(gmfgenNew.getGenAuditContainer_Description().getName()); private EStructuralFeature feature_genAuditContainer_audits = class_genAuditContainer.getEStructuralFeature(gmfgenNew.getGenAuditContainer_Audits().getName()); private EStructuralFeature feature_genAuditContainer_root = class_genAuditContainer.getEStructuralFeature(gmfgenNew.getGenAuditContainer_Root().getName()); private EStructuralFeature feature_genAuditRoot_categories = class_genAuditRoot.getEStructuralFeature(gmfgenNew.getGenAuditRoot_Categories().getName()); private EStructuralFeature feature_genAuditRoot_rules = class_genAuditRoot.getEStructuralFeature(gmfgenNew.getGenAuditRoot_Rules().getName()); private EStructuralFeature feature_genAuditRule_category = class_genAuditRule.getEStructuralFeature(gmfgenNew.getGenAuditRule_Category().getName()); void init() { registerDeletedAttributes(class_editorCandies, "diagramFileCreatorClassName", //$NON-NLS-1$ "preferenceInitializerClassName" //$NON-NLS-1$ ); registerDeletedAttributes(class_providerClassNames, "abstractParserClassName", //$NON-NLS-1$ "structuralFeatureParserClassName", //$NON-NLS-1$ "structuralFeaturesParserClassName", //$NON-NLS-1$ "paletteProviderClassName", //$NON-NLS-1$ "paletteProviderPriority", //$NON-NLS-1$ "propertyProviderClassName", //$NON-NLS-1$ "propertyProviderPriority" //$NON-NLS-1$ ); registerDeletedAttributes(class_editPartCandies, "referenceConnectionEditPolicyClassName", //$NON-NLS-1$ "externalNodeLabelHostLayoutEditPolicyClassName" //$NON-NLS-1$ ); registerDeletedAttributes(class_typeLinkModelFacet, "createCommandClassName"); //$NON-NLS-1$ { Map<String, EStructuralFeature> renamings = new HashMap<String, EStructuralFeature>(); renamings.put("requiredPluginIDs", feature_genPlugin_requiredPlugins); //$NON-NLS-1$ registerRenamedAttributes(class_genExpressionInterpreter, renamings); } { Map<String, EStructuralFeature> renamings = new HashMap<String, EStructuralFeature>(); renamings.put("metaFeature", feature_featureLabelModelFacet_metaFeatures); //$NON-NLS-1$ registerRenamedAttributes(class_featureLabelModelFacet, renamings); } registerRenamedType("CompositeFeatureLabelModelFacet", class_featureLabelModelFacet); //$NON-NLS-1$ myGenAuditContainer_ChildContainers = createNewReference("childContainers", class_genAuditContainer, true); //$NON-NLS-1$ { Map<String, EStructuralFeature> renamings = new HashMap<String, EStructuralFeature>(); renamings.put(myGenAuditContainer_ChildContainers.getName(), myGenAuditContainer_ChildContainers); registerRenamedAttributes(class_genAuditContainer, renamings); } myGenAuditRoot_Id = (EAttribute) EcoreUtil.copy(gmfgenNew.getGenAuditContainer_Id()); myGenAuditRoot_Name = (EAttribute) EcoreUtil.copy(gmfgenNew.getGenAuditContainer_Name()); myGenAuditRoot_Description = (EAttribute) EcoreUtil.copy(gmfgenNew.getGenAuditContainer_Description()); myGenAuditRoot_Audits = createNewReference("audits", class_genAuditRule, true); //$NON-NLS-1$ { Map<String, EStructuralFeature> renamings = new HashMap<String, EStructuralFeature>(); renamings.put(myGenAuditRoot_Audits.getName(), myGenAuditRoot_Audits); renamings.put(myGenAuditContainer_ChildContainers.getName(), myGenAuditContainer_ChildContainers); renamings.put(myGenAuditRoot_Id.getName(), myGenAuditRoot_Id); renamings.put(myGenAuditRoot_Name.getName(), myGenAuditRoot_Name); renamings.put(myGenAuditRoot_Description.getName(), myGenAuditRoot_Description); registerRenamedAttributes(class_genAuditRoot, renamings); } // ---> registerNarrowedAbstractType("GenFeatureInitializer", class_genFeatureValueSpec); //$NON-NLS-1$ myRootContainer = null; myProvidersContainer = null; myRequiredPlugins = null; } @SuppressWarnings("unchecked") @Override public boolean setValue(EObject object, EStructuralFeature feature, Object value, int position) { if (!gmfgen2006.equals(object.eClass().getEPackage())) { return super.setValue(object, feature, value, position); } if (feature_genPlugin_requiredPlugins.equals(feature) && class_genExpressionInterpreter.isInstance(object)) { String requiredPlugin = (String) value; saveRequiredPlugin(object, requiredPlugin); } else if (myGenAuditRoot_Id.equals(feature)) { EObject root = object; String id = (String) value; EObject rootContainer = getOrCreateRootContainerOnce(root); rootContainer.eSet(feature_genAuditContainer_id, id); fireMigrationApplied(true); } else if (myGenAuditRoot_Name.equals(feature)) { EObject root = object; String name = (String) value; EObject rootContainer = getOrCreateRootContainerOnce(root); rootContainer.eSet(feature_genAuditContainer_name, name); fireMigrationApplied(true); } else if (myGenAuditRoot_Description.equals(feature)) { EObject root = object; String description = (String) value; EObject rootContainer = getOrCreateRootContainerOnce(root); rootContainer.eSet(feature_genAuditContainer_description, description); fireMigrationApplied(true); } else if (myGenAuditContainer_ChildContainers.equals(feature) && class_genAuditRoot.isInstance(object)) { EObject root = object; EObject container = (EObject)value; if (myRootContainer != null) { ((List<EObject>)container.eGet(feature_genAuditContainer_path)).add(myRootContainer); } ((List<EObject>)root.eGet(feature_genAuditRoot_categories)).add(container); fireMigrationApplied(true); } else if (myGenAuditRoot_Audits.equals(feature) && class_genAuditRoot.isInstance(object)) { EObject root = object; EObject rule = (EObject)value; if (myRootContainer != null) { rule.eSet(feature_genAuditRule_category, myRootContainer); fireMigrationApplied(true); } ((List<EObject>)root.eGet(feature_genAuditRoot_rules)).add(rule); } else if (myGenAuditContainer_ChildContainers.equals(feature) && class_genAuditContainer.isInstance(object)) { EObject parent = object; EObject container = (EObject)value; ((List<EObject>)container.eGet(feature_genAuditContainer_path)).addAll(((List<EObject>)parent.eGet(feature_genAuditContainer_path))); ((List<EObject>)container.eGet(feature_genAuditContainer_path)).add(parent); ((List<EObject>)getOrCreateRoot(parent).eGet(feature_genAuditRoot_categories)).add(container); fireMigrationApplied(true); } else if (feature_genAuditContainer_audits.equals(feature) && class_genAuditContainer.isInstance(object)) { EObject container = object; EObject rule = (EObject)value; rule.eSet(feature_genAuditRule_category, container); ((List<EObject>)getOrCreateRoot(container).eGet(feature_genAuditRoot_rules)).add(rule); } else { // other cases are would be processed as defaults return super.setValue(object, feature, value, position); } return true; } private void saveRequiredPlugin(EObject expressionProvider, String requiredPlugin) { if (myRequiredPlugins == null) { myRequiredPlugins = new LinkedHashMap<EObject, Collection<String>>(); } Collection<String> requiredPlugins = myRequiredPlugins.get(expressionProvider); if (requiredPlugins == null) { requiredPlugins = new ArrayList<String>(); } requiredPlugins.add(requiredPlugin); myRequiredPlugins.put(expressionProvider, requiredPlugins); } private Map<EObject, Collection<String>> getSavedRequiredPlugins() { return myRequiredPlugins; } @SuppressWarnings("unchecked") @Override public void preResolve() { if (getSavedRequiredPlugins() != null) { for (EObject expressionProvider : getSavedRequiredPlugins().keySet()) { EObject container = (EObject) expressionProvider.eGet(feature_genExpressionProviderBase_container); if (container == null) { container = getOrCreateParenlessProvidersContainerOnce(expressionProvider); ((List<EObject>)container.eGet(feature_genExpressionProviderContainer_providers)).add(expressionProvider); } EObject editor = (EObject) container.eGet(feature_genExpressionProviderContainer_editorGen); if (editor == null) { editor = factory2006.create(class_genEditorGenerator); container.eResource().getContents().add(editor); //XXX!!! editor.eSet(feature_genEditorGenerator_expressionProviders, container); } EObject plugin = (EObject) editor.eGet(feature_genEditorGenerator_plugin); if (plugin == null) { plugin = factory2006.create(class_genPlugin); editor.eSet(feature_genEditorGenerator_plugin, plugin); } ((List<String>)plugin.eGet(feature_genPlugin_requiredPlugins)).addAll(getSavedRequiredPlugins().get(expressionProvider)); fireMigrationApplied(true); } getSavedRequiredPlugins().clear(); } } private EObject getOrCreateParenlessProvidersContainerOnce(EObject expressionProvider) { if (myProvidersContainer == null) { myProvidersContainer = factory2006.create(class_genExpressionProviderContainer); expressionProvider.eResource().getContents().add(myProvidersContainer); } return myProvidersContainer; } @SuppressWarnings("unchecked") private EObject getOrCreateRootContainerOnce(EObject root) { if (myRootContainer == null) { myRootContainer = factory2006.create(class_genAuditContainer); ((List<EObject>) root.eGet(feature_genAuditRoot_categories)).add(myRootContainer); } return myRootContainer; } @SuppressWarnings("unchecked") private EObject getOrCreateRoot(EObject auditContainer) { EObject result = (EObject) auditContainer.eGet(feature_genAuditContainer_root); if (result == null) { result = createRoot(auditContainer); ((List<EObject>) result.eGet(feature_genAuditRoot_categories)).add(auditContainer); } return result; } private EObject createRoot(EObject child) { EObject result = factory2006.create(class_genAuditRoot); if (child.eContainer() == null) { child.eResource().getContents().add(result); fireMigrationApplied(true); } return result; } /** * Allows us to use factory of dynamic package from year 2006 to create all instances, */ @Override public String getURI(String prefix, String uri) { if (is2005GenModel(prefix, uri)) { return ModelVersions.GMFGEN_2_0; } return super.getURI(prefix, uri); } static boolean is2005GenModel(String prefix, String uri) { return "gmfgen".equals(prefix) && (ModelVersions.GMFGEN_1_0.equals(uri) || ModelVersions.GMFGEN_PRE_2_0.equals(uri)); //$NON-NLS-1$ } }