/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.core.refactor;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.workspace.WorkspaceResourceFinderUtil;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.core.ModelImport;
import org.teiid.designer.metamodels.core.ModelType;
/**
* Updates the properties on the model import to poin to the newly copied model.
* @since 8.0
*/
public class ModelImportReferenceUpdator implements ReferenceUpdator {
/**
* @see org.teiid.designer.core.refactor.ReferenceUpdator#updateEObject(org.eclipse.emf.ecore.EObject, java.util.Map)
* @since 4.2
*/
@Override
public void updateEObject(final EObject eObject, final Map oldToNewObjects) {
CoreArgCheck.isNotNull(eObject);
CoreArgCheck.isNotNull(oldToNewObjects);
if(eObject instanceof ModelImport) {
// model import that needs to be updated
ModelImport modelImport = (ModelImport) eObject;
// new reource model annotation
ModelAnnotation newModel = getNewResourceModelAnnotation(modelImport, oldToNewObjects);
if(newModel != null) {
// resource for the new model annotation
Resource newResource = newModel.eResource();
// find properties on these and update the modelImport
String resourcePath = WorkspaceResourceFinderUtil.getWorkspaceUri(newResource);
if (resourcePath == null) {
return;
}
Resource eResource = eObject.eResource();
URI resourceURI = eResource.getURI();
URI importURI = newResource.getURI();
String uriString = URI.decode(importURI.toString());
if (importURI.isFile()) {
boolean deresolve = (resourceURI != null && !resourceURI.isRelative() && resourceURI.isHierarchical());
if (deresolve && !importURI.isRelative()) {
URI deresolvedURI = importURI.deresolve(resourceURI, true, true, false);
if (deresolvedURI.hasRelativePath()) {
importURI = deresolvedURI;
uriString = URI.decode(importURI.toString());
}
}
modelImport.setModelLocation(uriString);
} else {
modelImport.setModelLocation(uriString);
}
//modelImport.setPath(resourcePath);
modelImport.setName(this.getResourceName(newResource));
modelImport.setModelType(newModel.getModelType());
modelImport.setPrimaryMetamodelUri(newModel.getPrimaryMetamodelUri());
modelImport.setUuid(ModelerCore.getObjectIdString(newModel));
}
}
}
/**
* Get the modelannotation for the new/copied resource for whose old resource there is a model import.
* @param modelImport ModelImport to the old resource
* @param oldToNewObjects Map containig old new model annotation object
* @return The model annotation to the new resource.
* @since 4.2
*/
private ModelAnnotation getNewResourceModelAnnotation(final ModelImport modelImport, final Map oldToNewObjects) {
// properties on the model import to be matched against the old modelResource
String primaryMetamodelUri = modelImport.getPrimaryMetamodelUri();
String resourcePath = modelImport.getPath();
ModelType modelType = modelImport.getModelType();
for(final Iterator keyIter = oldToNewObjects.keySet().iterator(); keyIter.hasNext();) {
Object keyObj = keyIter.next();
if(keyObj instanceof ModelAnnotation) {
ModelAnnotation modelAnnotation = (ModelAnnotation) keyObj;
if(primaryMetamodelUri != null) {
if(!primaryMetamodelUri.equals(modelAnnotation.getPrimaryMetamodelUri())) {
continue;
}
}
if(modelType != null) {
int type = modelType.getValue();
ModelType oldModelType = modelAnnotation .getModelType();
if(oldModelType != null) {
int oldType = oldModelType.getValue();
if(type != oldType) {
continue;
}
}
}
if(resourcePath != null) {
Resource oldModelResource = modelAnnotation.eResource();
String modelPath = WorkspaceResourceFinderUtil.getWorkspaceUri(oldModelResource);
if(!resourcePath.equals(modelPath)) {
continue;
}
}
// all the properties match find the new modelAnnotation
return (ModelAnnotation) oldToNewObjects.get(keyObj);
}
}
return null;
}
/**
* Return the name of the specified resource removing any file
* extension if one exists.
* @param resource
* @return
*/
private String getResourceName(final Resource resource) {
CoreArgCheck.isNotNull(resource);
final URI resourceUri = resource.getURI();
final String modelNameWithExt = resourceUri.lastSegment();
final String extension = resourceUri.fileExtension();
if (extension != null) {
final int index = modelNameWithExt.indexOf(extension);
if (index > 1) {
return modelNameWithExt.substring(0, index - 1); // also remove the "."
}
}
return modelNameWithExt;
}
}