//------------------------------------------------------------------------------ // 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.internal; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.xml.type.AnyType; import org.eclipse.epf.persistence.MultiFileResourceSetImpl; import org.eclipse.epf.persistence.migration.UMA2UMAResourceHandler; import org.eclipse.epf.uma.Activity; import org.eclipse.epf.uma.ContentDescription; import org.eclipse.epf.uma.ContentPackage; import org.eclipse.epf.uma.DescribableElement; import org.eclipse.epf.uma.ProcessElement; import org.eclipse.epf.uma.ProcessPackage; import org.eclipse.epf.uma.UmaFactory; import org.eclipse.epf.uma.UmaPackage; import org.eclipse.epf.uma.WorkBreakdownElement; import org.eclipse.epf.uma.WorkOrder; import org.eclipse.epf.uma.WorkOrderType; /** * @author Phong Nguyen Le * @since 1.0 */ public class UMA2UMAResourceHandler0 extends UMA2UMAResourceHandler { private Set procMovedFeatureNames; private Map guidToPresentationMap; private Set classNamesToSavePresentationURI; public UMA2UMAResourceHandler0() { super(); guidToPresentationMap = new HashMap(); procMovedFeatureNames = new HashSet(Arrays.asList(new String[] { "purpose" //$NON-NLS-1$ , "keyConsiderations" //$NON-NLS-1$ , "alternatives" //$NON-NLS-1$ , "howtoStaff" //$NON-NLS-1$ , "usageGuidance" //$NON-NLS-1$ , "externalId" //$NON-NLS-1$ , "scope" //$NON-NLS-1$ , "usageNotes" //$NON-NLS-1$ , "scale" //$NON-NLS-1$ , "projectCharacteristics" //$NON-NLS-1$ , "riskLevel" //$NON-NLS-1$ , "estimatingTechnique" //$NON-NLS-1$ , "projectMemberExpertise" //$NON-NLS-1$ , "typeOfContract" //$NON-NLS-1$ , "techniques" //$NON-NLS-1$ , "mainDescription" //$NON-NLS-1$ })); } /* * (non-Javadoc) * * @see org.eclipse.epf.persistence.migration.UMA2UMAResourceHandler#getNewFeature(org.eclipse.emf.ecore.EObject, * java.lang.String) */ protected EStructuralFeature getNewFeature(EObject owner, String featureName) { if ("presentationName".equals(featureName) && owner instanceof ContentDescription) { //$NON-NLS-1$ return UmaPackage.eINSTANCE .getMethodElement_PresentationName(); } if (procMovedFeatureNames.contains(featureName)) { if (owner instanceof ProcessElement) { ContentDescription content = ((ProcessElement) owner) .getPresentation(); EAttribute attrib = getEAttribute(content.eClass(), featureName); if (attrib != null) { return attrib; } } } if ("WorkOrder".equals(featureName) && owner instanceof ProcessPackage) { //$NON-NLS-1$ return UmaPackage.eINSTANCE.getProcessPackage_ProcessElements(); } return super.getNewFeature(owner, featureName); } /* * (non-Javadoc) * * @see org.eclipse.epf.persistence.migration.UMA2UMAResourceHandler#getNewOwner(org.eclipse.emf.ecore.EObject, * java.lang.String) */ protected EObject getNewOwner(EObject oldOwner, String featureName) { if ("presentationName".equals(featureName) && oldOwner instanceof ContentDescription) { //$NON-NLS-1$ DescribableElement de = ((DescribableElement) oldOwner.eContainer()); if (de instanceof Activity) { return null; } return de; } if (procMovedFeatureNames.contains(featureName) && oldOwner instanceof ProcessElement) { return ((ProcessElement) oldOwner).getPresentation(); } if ("WorkOrder".equals(featureName) && oldOwner instanceof ProcessPackage) { //$NON-NLS-1$ return oldOwner; } return super.getNewOwner(oldOwner, featureName); } /* (non-Javadoc) * @see org.eclipse.epf.persistence.migration.UMA2UMAResourceHandler#getNewValue(org.eclipse.emf.ecore.EObject, java.lang.String, org.eclipse.emf.ecore.xml.type.AnyType) */ protected Object getNewValue(EObject oldOwner, String featureName, AnyType value) { if ("WorkOrder".equals(featureName) && oldOwner instanceof ProcessPackage) { //$NON-NLS-1$ WorkOrder workOrder = UmaFactory.eINSTANCE.createWorkOrder(); workOrder.setGuid((String) getSingleValue(value.getAnyAttribute(), "guid")); //$NON-NLS-1$ String predGuid = (String) getSingleValue(value.getAnyAttribute(), "pred"); //$NON-NLS-1$ if (predGuid == null) { InternalEObject obj = (InternalEObject) getSingleValue(value .getMixed(), "pred"); //$NON-NLS-1$ predGuid = obj.eProxyURI().authority(); } MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) oldOwner .eResource().getResourceSet(); WorkBreakdownElement pred = (WorkBreakdownElement) resourceSet .getEObject(predGuid); workOrder.setPred(pred); workOrder.setLinkType(WorkOrderType.FINISH_TO_FINISH); return workOrder; } return getText(value); } public void savePresentationURIFor(Set classNames) { classNamesToSavePresentationURI = classNames; } public URI getPresentationURI(String guid) { return (URI) guidToPresentationMap.get(guid); } /* (non-Javadoc) * @see org.eclipse.epf.persistence.migration.MigrationResourceHandler#handleUnknownData(org.eclipse.emf.ecore.EObject, java.lang.Object) */ protected void handleUnknownData(EObject e, AnyType unknownData) { super.handleUnknownData(e, unknownData); if (classNamesToSavePresentationURI != null && e instanceof ContentPackage) { for (Iterator iter = getValue(unknownData.getMixed(), "contentElements").iterator(); iter.hasNext();) { //$NON-NLS-1$ AnyType value = (AnyType) iter.next(); if (value != null && classNamesToSavePresentationURI.contains(value .eClass().getName())) { Object presentation = getSingleValue(value.getMixed(), "presentation"); //$NON-NLS-1$ if (presentation != null) { Object guid = getSingleValue(value.getAnyAttribute(), "guid"); //$NON-NLS-1$ URI uri = ((InternalEObject) presentation).eProxyURI(); guidToPresentationMap.put(guid, uri); } } } } } }