/*
* ResourceUtil.java
* Created on 2004-08-20
*
* cvs-id : $Id$
*/
package org.erlide.engine.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
/**
* <p>
* contains static helping functionality to work on file resources in the
* workspace.
* </p>
*
* @author Leif Frenzel
* @author Andrei Formiga
*/
public class ResourceUtil {
/**
* <p>
* reads an input stream and returns the contents as String.
* </p>
*/
public static String readStream(final InputStream is) throws IOException {
final StringBuilder sbResult = new StringBuilder();
try (final BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
String line = br.readLine();
while (line != null) {
sbResult.append(line);
sbResult.append('\n');
line = br.readLine();
}
}
is.close();
return sbResult.toString();
}
/**
* finds the corresponding resource for the specified element. This is
* element itself, if it is an IResource, or an adapter. Returns null, if no
* resource could be found.
*/
public static IResource findResource(final Object element) {
IResource result = null;
if (element instanceof IResource) {
result = (IResource) element;
} else if (element instanceof IAdaptable) {
final Object adapter = ((IAdaptable) element).getAdapter(IResource.class);
if (adapter instanceof IResource) {
result = (IResource) adapter;
}
}
return result;
}
public static IResource recursiveFindNamedResource(final IContainer container,
final String name, final ContainerFilter filter) throws CoreException {
if (!container.isAccessible()) {
return null;
}
IResource r = container.findMember(name);
if (r != null && (filter == null || filter.accept(container))) {
return r;
}
final IResource[] members = container.members();
for (final IResource element : members) {
r = element;
if (r instanceof IContainer) {
r = recursiveFindNamedResource((IContainer) r, name, filter);
if (r != null) {
return r;
}
}
}
return null;
}
public static IFile getFileFromLocation(final String location) {
final IWorkspaceRoot wr = ResourcesPlugin.getWorkspace().getRoot();
final IFile[] f = wr.findFilesForLocationURI(URIUtil.toURI(location));
if (f.length > 0) {
return f[0];
}
return null;
}
public static boolean samePath(final String p1, final String p2) {
if (EFS.getLocalFileSystem().isCaseSensitive()) {
return p1.equals(p2);
}
return p1.equalsIgnoreCase(p2);
}
private final static class FindResourceVisitor implements IResourceVisitor {
private static final int FIND_BY_NAME = 1;
private static final int FIND_BY_LOCATION = 2;
private final String fileName;
private IResource found = null;
private final int how;
private FindResourceVisitor(final String fileName, final int how) {
this.fileName = fileName;
this.how = how;
}
@Override
public boolean visit(final IResource resource) throws CoreException {
if (compare(resource, fileName, how)) {
found = resource;
return false;
}
return true;
}
private boolean compare(final IResource resource, final String s,
final int theHow) {
if (theHow == FIND_BY_NAME) {
return ResourceUtil.samePath(resource.getName(), s);
} else if (theHow == FIND_BY_LOCATION) {
return ResourceUtil.samePath(resource.getLocation().toString(), s);
} else {
return false;
}
}
public IResource getFound() {
return found;
}
}
public static IResource findResourceByLocation(final IContainer container,
final String fileName) {
return findResource(container, fileName, FindResourceVisitor.FIND_BY_LOCATION);
}
public static IResource findResourceByName(final IContainer container,
final String fileName) {
return findResource(container, fileName, FindResourceVisitor.FIND_BY_NAME);
}
private static IResource findResource(final IContainer container,
final String fileName, final int how) {
final FindResourceVisitor visitor = new FindResourceVisitor(fileName, how);
try {
container.accept(visitor);
} catch (final CoreException e) {
return null;
}
return visitor.getFound();
}
}