//------------------------------------------------------------------------------ // 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.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Map; 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.xmi.XMLResource; import org.eclipse.emf.ecore.xmi.impl.BasicResourceHandler; 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 abstract class MigrationResourceHandler extends BasicResourceHandler { private static final boolean DEBUG = true; public MigrationResourceHandler() { } /* * (non-Javadoc) * * @see org.eclipse.emf.ecore.xmi.impl.BasicResourceHandler#postLoad(org.eclipse.emf.ecore.xmi.XMLResource, * java.io.InputStream, java.util.Map) */ public void postLoad(XMLResource resource, InputStream inputStream, Map options) { if (!resource.getEObjectToExtensionMap().isEmpty()) { if (DEBUG) { System.out .println("MigrationResourceHandler.postLoad(): " + resource.getURI()); //$NON-NLS-1$ System.out.println("---- Start unknown features ----"); //$NON-NLS-1$ } for (Iterator iter = resource.getEObjectToExtensionMap().entrySet() .iterator(); iter.hasNext();) { Map.Entry entry = (Map.Entry) iter.next(); if (entry.getKey() instanceof EObject) { // handle moved data // handleUnknownData((EObject) entry.getKey(), (AnyType)entry.getValue()); } } if (DEBUG) System.out.println("---- End unknown features ----"); //$NON-NLS-1$ } } public static String getText(AnyType value) { try { if (value == null) return null; FeatureMap.Entry entry = (FeatureMap.Entry) value.getMixed().get(0); return (String) entry.getValue(); } catch (RuntimeException e) { throw e; } } 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; } 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); } } } protected abstract boolean handleUnknownFeature(EObject owner, EStructuralFeature feature, Object value); private void handleUnknownFeatures(EObject owner, FeatureMap featureMap) { for (Iterator iter = featureMap.iterator(); iter.hasNext();) { FeatureMap.Entry entry = (FeatureMap.Entry) iter.next(); EStructuralFeature f = entry.getEStructuralFeature(); if(handleUnknownFeature(owner, f, entry.getValue())) { iter.remove(); } } } /** * @param key * @param value */ protected void handleUnknownData(EObject e, AnyType unknownData) { handleUnknownFeatures(e, unknownData.getMixed()); handleUnknownFeatures(e, unknownData.getAnyAttribute()); } 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; } }