| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2006 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 implementation |
| //------------------------------------------------------------------------------ |
| package org.eclipse.epf.persistence.migration; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| 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.emf.ecore.util.FeatureMap; |
| import org.eclipse.emf.ecore.util.FeatureMap.Entry; |
| import org.eclipse.emf.ecore.xml.type.AnyType; |
| |
| /** |
| * Resource handler for migrating UMA library from one version to another. |
| * |
| * @author Phong Nguyen Le |
| * @since 1.0 |
| */ |
| public class UMA2UMAResourceHandler extends MigrationResourceHandler { |
| |
| private static final boolean DEBUG = true; |
| |
| private List moveInfos; |
| |
| public UMA2UMAResourceHandler() { |
| moveInfos = new ArrayList(); |
| } |
| |
| protected static EAttribute getEAttribute(EClass eClass, String name) { |
| for (Iterator iterator = eClass.getEAllAttributes().iterator(); iterator |
| .hasNext();) { |
| EAttribute attrib = (EAttribute) iterator.next(); |
| if (attrib.getName().equals(name)) { |
| return attrib; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Subclass can override this method to customize rules to move data |
| * |
| * @param owner |
| * @param featureName |
| * @return |
| */ |
| protected EStructuralFeature getNewFeature(EObject owner, String featureName) { |
| return null; |
| } |
| |
| /** |
| * Subclass can override this method to customize rules to move data |
| * |
| * @param oldOwner |
| * @param featureName |
| * @return |
| */ |
| protected EObject getNewOwner(EObject oldOwner, String featureName) { |
| return null; |
| } |
| |
| protected Object getNewValue(EObject oldOwner, String featureName, |
| AnyType value) { |
| return null; |
| } |
| |
| public void moveData() { |
| for (Iterator iter = moveInfos.iterator(); iter.hasNext();) { |
| MoveInfo info = (MoveInfo) iter.next(); |
| EObject newOwner = getNewOwner(info.oldOwner, info.oldFeatureName); |
| if (newOwner != null) { |
| setValue(newOwner, info.newFeature, info.value); |
| } |
| } |
| } |
| |
| public static void setValue(EObject eObject, EStructuralFeature feature, |
| Object value) { |
| if (!feature.isMany()) { |
| eObject.eSet(feature, value); |
| } else { |
| Collection values = (Collection) eObject.eGet(feature); |
| if (value instanceof Collection) { |
| values.addAll((Collection) value); |
| } else { |
| values.add(value); |
| } |
| } |
| |
| } |
| |
| private static class MoveInfo { |
| EObject oldOwner; |
| |
| String oldFeatureName; |
| |
| EStructuralFeature newFeature; |
| |
| Object value; |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see java.lang.Object#toString() |
| */ |
| public String toString() { |
| return new StringBuffer() |
| .append(getClass().getName()) |
| .append("(\n") //$NON-NLS-1$ |
| .append(" oldFeatureName: ").append(oldFeatureName).append('\n') //$NON-NLS-1$ |
| .append(" newFeature: ").append(newFeature).append('\n') //$NON-NLS-1$ |
| .append(" value: ").append(value).append('\n') //$NON-NLS-1$ |
| .append(")").toString(); //$NON-NLS-1$ |
| } |
| } |
| |
| public static Object getSingleValue(FeatureMap featureMap, |
| String featureName) { |
| for (Iterator iter = featureMap.iterator(); iter.hasNext();) { |
| FeatureMap.Entry entry = (Entry) iter.next(); |
| if (entry.getEStructuralFeature().getName().equals(featureName)) { |
| return entry.getValue(); |
| } |
| } |
| return null; |
| } |
| |
| protected static Collection getValue(FeatureMap featureMap, |
| String featureName) { |
| Collection list = new ArrayList(); |
| for (Iterator iter = featureMap.iterator(); iter.hasNext();) { |
| FeatureMap.Entry entry = (Entry) iter.next(); |
| if (entry.getEStructuralFeature().getName().equals(featureName)) { |
| list.add(entry.getValue()); |
| } |
| } |
| return list; |
| } |
| |
| public void clearMoveInfos() { |
| moveInfos.clear(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.epf.persistence.migration.MigrationResourceHandler#handleUnknownFeature(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object) |
| */ |
| protected boolean handleUnknownFeature(EObject owner, EStructuralFeature feature, Object value) { |
| String featureName = feature.getName(); |
| EStructuralFeature newFeature = getNewFeature(owner, featureName); |
| if (newFeature != null) { |
| MoveInfo moveInfo = new MoveInfo(); |
| moveInfo.oldOwner = owner; |
| moveInfo.oldFeatureName = featureName; |
| moveInfo.newFeature = newFeature; |
| moveInfo.value = value instanceof AnyType ? getNewValue( |
| owner, featureName, (AnyType) value) |
| : value; |
| moveInfos.add(moveInfo); |
| if (DEBUG) { |
| System.out.println(moveInfo); |
| System.out.println(); |
| } |
| return true; |
| } |
| return false; |
| } |
| |
| } |