package at.bestsolution.efxclipse.tooling.ui.util;
import java.io.File;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
public class RelativeFileLocator {
public static File locateFile(IFile file, String filePath) {
URI uri = URI.createPlatformResourceURI(file.getProject().getName() + "/" + file.getProjectRelativePath().toString(),true);
return locateFile(uri, filePath);
}
public static File locateFile(URI uri, String filePath) {
IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(uri.segment(1));
IJavaProject jp = JavaCore.create(p);
// Absolute to project
if( filePath.startsWith("/") ) {
filePath = filePath.substring(1); // Remove the leading /
IFile f = p.getFile(filePath);
if( f.exists() ) {
return f.getLocation().toFile().getAbsoluteFile();
} else if( jp != null ) {
try {
for( IPackageFragmentRoot r : jp.getPackageFragmentRoots() ) {
if( r.isArchive() ) {
//TODO We should allow to load styles from the referenced jars
} else if( r.getResource() instanceof IFolder ) {
IFolder folder = (IFolder) r.getResource();
if( folder.exists() ) {
f = folder.getFile(filePath);
if( f.exists() ) {
return f.getLocation().toFile().getAbsoluteFile();
}
}
}
}
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else {
URI fileUri = null;
try {
fileUri = URI.createURI(filePath);
} catch (Exception e) {
// TODO: handle exception
}
if( fileUri != null && fileUri.isPlatformResource() ) {
Path path = new Path(fileUri.toPlatformString(true));
IWorkspaceRoot root = jp.getProject().getWorkspace().getRoot();
IFile file = root.getFile(path);
if( file.exists() ) {
return file.getLocation().toFile().getAbsoluteFile();
}
} else {
IPath path = null;
for( int i = 2; i < uri.segmentCount() - 1; i++ ) {
if( path == null ) {
path = new Path(uri.segment(i));
} else {
path = path.append(uri.segment(i));
}
}
if( path != null ) {
IFile f = p.getFile(path.append(filePath));
if( f.exists() ) {
return f.getLocation().toFile().getAbsoluteFile();
}
}
}
}
return null;
}
}