/*
* 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.container;
import java.io.IOException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.teiid.core.designer.id.ObjectID;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.resource.EmfResource;
import org.teiid.designer.core.resource.EmfResourceSet;
/**
* @since 8.0
*/
public class CrossContainerFinder
{
//
// Instance variables:
//
private final Container sourceContainer;
private final Container targetContainer;
//
// Constructors:
//
public CrossContainerFinder(Container container1, Container container2) {
this.sourceContainer = container1;
this.targetContainer = container2;
}
//
// Data methods:
//
/** Find the corresponding EObject in the other container
*
*/
public EObject find(EObject object) {
if (object != null) {
Resource sourceRes = object.eResource();
// find the resource in the other container:
Resource targetRes = find(sourceRes);
if (targetRes != null) {
if (!targetRes.isLoaded()) {
// need to load resource:
try {
targetRes.load(targetRes.getResourceSet().getLoadOptions());
} catch (IOException e) {
ModelerCore.Util.log(e);
} // endtry
} // endif
return targetRes.getEObject(sourceRes.getURIFragment(object));
} // endif
} //endif
return null;
}
/** Find the corresponding Resource in the other container
*
*/
public Resource find(Resource resource) {
// find the source container:
ResourceSet sourceResourceSet = resource.getResourceSet();
Container srcCont;
if (sourceResourceSet instanceof Container) {
srcCont = (Container) sourceResourceSet;
} else if (sourceResourceSet instanceof EmfResourceSet) {
srcCont = ((EmfResourceSet)sourceResourceSet).getContainer();
} else {
// unknown resourceSet; cannot process:
return null;
} //endif
// determine target container:
Container tgtCont;
if (srcCont == sourceContainer) {
tgtCont = targetContainer;
} else {
tgtCont = sourceContainer;
} // endif
Resource rv;
if (resource instanceof EmfResource) {
EmfResource eRes = (EmfResource) resource;
ObjectID uuid = eRes.getUuid();
rv = tgtCont.getResourceFinder().findByUUID(uuid, false);
} else {
String xsdName = resource.getURI().lastSegment();
Resource[] wsRes = tgtCont.getResourceFinder().findByName(xsdName, true, false);
// if (wsRes.length != 1) {
// throw new IllegalStateException("too many resources!");
// } // endif
rv = wsRes[0];
} //endif
// otherwise, unsupported resource type:
return rv;
}
//
// Static Utility methods:
//
public static CrossContainerFinder createWorkspaceFinder(Container source) {
try {
return new CrossContainerFinder(source, ModelerCore.getModelContainer());
} catch (CoreException e) {
// shouldn't happen:
ModelerCore.Util.log(e);
return null;
} // endtry
}
}