/*
* 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.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.teiid.core.designer.id.IDGenerator;
import org.teiid.core.designer.id.InvalidIDException;
import org.teiid.core.designer.id.ObjectID;
import org.teiid.core.designer.id.UUID;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.metamodel.aspect.AspectManager;
import org.teiid.designer.core.metamodel.aspect.sql.SqlAspect;
import org.teiid.designer.core.resource.EmfResource;
/**
* SqlStringConverter
*
* @since 8.0
*/
public class SqlStringConverter {
/** Number of characters in a UUID */
public static final int UUID_STRING_LENGTH = 43;
/** List containing the global, shared system resources (System.xmi, SystemPhysical.xmi) */
private static final List SYSTEM_RESOURCES = Arrays.asList(ModelerCore.getSystemVdbResources());
/**
* Converts a String containing UUIDs of the form "mmuuid:2b7de341-7836-1e3f-be17-fda290a3df83"
* into resolved MetaObject full names as much as possible. If an object cannot be found
* in the specified MetadataSession, it is left as a uuid.
*/
public static String convertUUIDsToFullNames(final String uuidString, final Collection eResources) {
if (CoreStringUtil.isEmpty(uuidString)) {
return CoreStringUtil.Constants.EMPTY_STRING;
}
final StringBuffer sb = new StringBuffer();
// If there are no UUIDs in the string return
int index = uuidString.indexOf(UUID.PROTOCOL);
if ( index == -1 ) {
return uuidString;
}
sb.append(uuidString.substring(0, index));
while ( index != -1 ) {
String id = null;
try {
id = uuidString.substring(index, index + UUID_STRING_LENGTH);
final ObjectID uuid = IDGenerator.getInstance().stringToObject(id, UUID.PROTOCOL);
final EObject obj = findEObjectInResourceSet(uuid.toString(), eResources);
if ( obj != null ) {
final SqlAspect aspect = AspectManager.getSqlAspect(obj);
String name = null;
if (aspect != null) {
// check the character preceeding UUID.PROTOCOL
if (index > 0 && uuidString.charAt(index - 1) == '.') {
// If the preceeding character was '.' then this is an
// aliased element symbol, so use the short name
name = aspect.getName(obj);
} else {
name = aspect.getFullName(obj);
}
if (!CoreStringUtil.isEmpty(name)) {
sb.append(name);
}
}
} else {
sb.append(id);
String msg = ModelerCore.Util.getString("SqlStringConverter.unable_to_find_eobject_with_uuid",id); //$NON-NLS-1$
ModelerCore.Util.log(IStatus.ERROR, msg);
}
final int nextIndex = uuidString.indexOf(UUID.PROTOCOL, index + UUID_STRING_LENGTH);
if ( nextIndex == -1 ) {
sb.append(uuidString.substring(index + UUID_STRING_LENGTH));
break;
}
sb.append(uuidString.substring(index + UUID_STRING_LENGTH, nextIndex));
index = nextIndex;
} catch (InvalidIDException e) {
ModelerCore.Util.log(e);
sb.append(id);
final int nextIndex = uuidString.indexOf(UUID.PROTOCOL, index + UUID_STRING_LENGTH);
sb.append(uuidString.substring(index + UUID_STRING_LENGTH, nextIndex));
index = nextIndex;
}
}
return sb.toString();
}
private static EObject findEObjectInResourceSet(final String uuid, final Collection eResources) {
for (final Iterator iter = eResources.iterator(); iter.hasNext();) {
final Resource resource = (Resource)iter.next();
// Load any EmfResource instance so that UUIDs can be resolved
if (resource instanceof EmfResource) {
if (!resource.isLoaded()) {
try {
resource.load(Collections.EMPTY_MAP);
} catch (IOException e) {
ModelerCore.Util.log(IStatus.ERROR,e.getLocalizedMessage());
}
}
final EObject eObj = resource.getEObject(uuid);
if (eObj != null) {
return eObj;
}
}
}
// if not found, check the System Resources
return findEobjectInSystemResources(uuid);
}
private static EObject findEobjectInSystemResources(final String uuid) {
// if not found, check the System Resources
for (final Iterator iter = SYSTEM_RESOURCES.iterator(); iter.hasNext();) {
final Resource resource = (Resource)iter.next();
if (resource instanceof EmfResource) {
final EObject eObj = resource.getEObject(uuid);
if (eObj != null) {
return eObj;
}
}
}
return null;
}
}