blob: b2c38f1bc31f3a7834ca3fe78a7a776d75a62a4d [file] [log] [blame]
//------------------------------------------------------------------------------
// 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;
}
}