| /* |
| * Copyright (c) 2007, 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: Borland - initial API and implementation |
| */ |
| package org.eclipse.gmf.internal.map.util; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.ecore.EAttribute; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| import org.eclipse.gmf.internal.common.migrate.MigrationDelegateImpl; |
| import org.eclipse.gmf.mappings.FeatureLabelMapping; |
| import org.eclipse.gmf.mappings.FeatureValueSpec; |
| import org.eclipse.gmf.mappings.GMFMapFactory; |
| import org.eclipse.gmf.mappings.GMFMapPackage; |
| import org.eclipse.gmf.mappings.LabelMapping; |
| import org.eclipse.gmf.mappings.Language; |
| import org.eclipse.gmf.mappings.MappingEntry; |
| import org.eclipse.gmf.mappings.ValueExpression; |
| |
| class MigrationDelegate extends MigrationDelegateImpl { |
| private final Map<LabelMapping, FeatureLabelMapping> myLabelMappingMigrations; |
| private EAttribute myLabelMapping_ViewPattern; |
| private EAttribute myLabelMapping_EditPattern; |
| private EReference myLabelMapping_Features; |
| private EAttribute myFeatureValueSpec_Body; |
| private EAttribute myFeatureValueSpec_Language; |
| |
| MigrationDelegate() { |
| myLabelMappingMigrations = new HashMap<LabelMapping, FeatureLabelMapping>(); |
| } |
| |
| void init() { |
| //registerNarrowReferenceType(GMFMapPackage.eINSTANCE.getFeatureSeqInitializer_Initializers(), GMFMapPackage.eINSTANCE.getFeatureValueSpec()); |
| // --> |
| registerNarrowedAbstractType("FeatureInitializer", GMFMapPackage.eINSTANCE.getFeatureValueSpec()); |
| |
| //registerNarrowReferenceType(GMFMapPackage.eINSTANCE.getMappingEntry_LabelMappings(), GMFMapPackage.eINSTANCE.getFeatureLabelMapping()); |
| // --> |
| myLabelMapping_Features = EcoreUtil.copy(GMFMapPackage.eINSTANCE.getFeatureLabelMapping_Features()); |
| myLabelMapping_ViewPattern = EcoreUtil.copy(GMFMapPackage.eINSTANCE.getFeatureLabelMapping_ViewPattern()); |
| myLabelMapping_EditPattern = EcoreUtil.copy(GMFMapPackage.eINSTANCE.getFeatureLabelMapping_EditPattern()); |
| { |
| Map<String, EStructuralFeature> renamings = new HashMap<String, EStructuralFeature>(); |
| renamings.put(myLabelMapping_ViewPattern.getName(), myLabelMapping_ViewPattern); |
| renamings.put(myLabelMapping_EditPattern.getName(), myLabelMapping_EditPattern); |
| renamings.put(myLabelMapping_Features.getName(), myLabelMapping_Features); |
| registerRenamedAttributes(GMFMapPackage.eINSTANCE.getLabelMapping(), renamings); |
| } |
| |
| myFeatureValueSpec_Body = EcoreUtil.copy(GMFMapPackage.eINSTANCE.getValueExpression_Body()); |
| myFeatureValueSpec_Language = EcoreUtil.copy(GMFMapPackage.eINSTANCE.getValueExpression_Language()); |
| { |
| Map<String, EStructuralFeature> renamings = new HashMap<String, EStructuralFeature>(); |
| renamings.put(myFeatureValueSpec_Body.getName(), myFeatureValueSpec_Body); |
| renamings.put(myFeatureValueSpec_Language.getName(), myFeatureValueSpec_Language); |
| registerRenamedAttributes(GMFMapPackage.eINSTANCE.getFeatureValueSpec(), renamings); |
| } |
| } |
| |
| @Override |
| public boolean setValue(EObject object, EStructuralFeature feature, Object value, int position) { |
| if (myLabelMapping_ViewPattern.equals(feature)) { |
| LabelMapping mapping = (LabelMapping) object; |
| String viewPattern = (String) value; |
| FeatureLabelMapping migratedMapping = saveFeatureLabelMappingFor(mapping); |
| migratedMapping.setViewPattern(viewPattern); |
| fireMigrationApplied(true); |
| } else if (myLabelMapping_EditPattern.equals(feature)) { |
| LabelMapping mapping = (LabelMapping) object; |
| String editPattern = (String) value; |
| FeatureLabelMapping migratedMapping = saveFeatureLabelMappingFor(mapping); |
| migratedMapping.setViewPattern(editPattern); |
| fireMigrationApplied(true); |
| } else if (myLabelMapping_Features.equals(feature)) { |
| LabelMapping mapping = (LabelMapping) object; |
| EAttribute attribute = (EAttribute) value; |
| FeatureLabelMapping migratedMapping = saveFeatureLabelMappingFor(mapping); |
| migratedMapping.getFeatures().add(attribute); |
| fireMigrationApplied(true); |
| } else if (myFeatureValueSpec_Body.equals(feature)) { |
| FeatureValueSpec featureRef = (FeatureValueSpec) object; |
| String body = (String) value; |
| ValueExpression constraint = getOrCreateValueExpression(featureRef); |
| constraint.setBody(body); |
| fireMigrationApplied(true); |
| } else if (myFeatureValueSpec_Language.equals(feature)) { |
| FeatureValueSpec featureRef = (FeatureValueSpec) object; |
| ValueExpression constraint = getOrCreateValueExpression(featureRef); |
| Language lang = Language.get((String) value); |
| constraint.setLanguage(lang); |
| fireMigrationApplied(true); |
| } else { |
| // other cases are would be processed as defaults |
| return super.setValue(object, feature, value, position); |
| } |
| return true; |
| } |
| |
| private ValueExpression getOrCreateValueExpression(FeatureValueSpec featureRef) { |
| ValueExpression constraint = featureRef.getValue(); |
| if (constraint == null) { |
| constraint = GMFMapFactory.eINSTANCE.createValueExpression(); |
| featureRef.setValue(constraint); |
| } |
| return constraint; |
| } |
| |
| private FeatureLabelMapping saveFeatureLabelMappingFor(LabelMapping labelMapping) { |
| FeatureLabelMapping migrated = myLabelMappingMigrations.get(labelMapping); |
| if (migrated == null) { |
| migrated = GMFMapFactory.eINSTANCE.createFeatureLabelMapping(); |
| myLabelMappingMigrations.put(labelMapping, migrated); |
| } |
| return migrated; |
| } |
| |
| @Override |
| public void preResolve() { |
| for (LabelMapping mapping : myLabelMappingMigrations.keySet()) { |
| FeatureLabelMapping migrated = myLabelMappingMigrations.get(mapping); |
| if (!migrated.getFeatures().isEmpty()) { |
| MappingEntry entry = mapping.getMapEntry(); |
| EList<LabelMapping> labelMappings = entry.getLabelMappings(); |
| int originalIndex = labelMappings.indexOf(mapping); |
| if (originalIndex != -1) { |
| migrated.setDiagramLabel(mapping.getDiagramLabel()); |
| if (mapping.isReadOnly()) { |
| migrated.setReadOnly(true); |
| } |
| labelMappings.set(originalIndex, migrated); |
| } |
| } |
| } |
| } |
| } |